我有一个包含两个文档的集合
{
"_id" : ObjectId("5784def78c669ee061519aaf"),
"name" : "nithin",
"sal" : 2000.0,
"age" : 20.0
},
{
"_id" : ObjectId("5784def78c669ee061519ab0"),
"name" : "nithin",
"sal" : 20.0,
"age" : 2000.0
}
我想找到给定姓名和相应年龄的最低年龄
在这种情况下,最低年龄为20岁,相应的年龄为2000
岁运行我的查询如下:
db.test.aggregate([{
"$group":{"_id":"$name" ,"minSalary" :{"$min":"$sal"} , "ages":{"$addToSet":{"ageval":"$age","salval":"$sal"}}}}
,{"$project": {
"_id":0,
"sal":"$minSalary",
"ages": "$ages"
}
},
{
"$unwind":"$ages"
}
,
{
**"$match":{ "ages.salval":**20** }**
}
]
)
但问题是我希望$match直接应用于 minSalary 而不是将过滤器值编码为 20 .请帮忙
升序按"name"和"sal"$sort
文档,然后按"name"$group
并使用$$ROOT
系统变量返回$first
文档。
db.test.aggregate(
[
{ "$sort": { "name": 1, "sal": 1 } },
{ "$group": {
"_id": "$name",
"matched_doc": { "$first": "$$ROOT" }
}}
]
)
我发现你的问题有点不清楚,但这里有两种情况的尝试。
- 将年龄和姓名分组在一起,然后获得最低工资。返回同名同年龄组人员的最低工资
db.getCollection('sal').aggregate([
{
$group : {
_id : {
age : "$age",
name : "$name"
},
minSal : {
$min : "$sal"
}
}
}
])
- 仅按年龄组分组,获得每个年龄组的最低工资
db.getCollection('sal').aggregate([
{
$group : {
_id : "$age", minSal : { $min : "$sal"}
}
}
])