使用聚合管道,我想获得代表price
的最高key
的文档。
例如,拿这个集合:
[
{
"_id":"323232",
"name":"Something",
"key":"A",
"price":"100"
},
{
"_id":"157236",
"name":"Another thing",
"key":"B",
"price":75
},
{
"_id":"555232",
"name":"Something or another",
"key":"B",
"price":78
},
{
"_id":"83234",
"name":"Something or another",
"key":"A",
"price":20
}
]
期望的结果:
[
{
"_id":"323232",
"name":"Something",
"key":"A",
"price":"100"
},
{
"_id":"555232",
"name":"Something or another",
"key":"B",
"price":78
}
]
答案 0 :(得分:1)
这就是我做的事情
db.test.aggregate([
{
$group : {
_id : '$key',
maxVal : {$max : '$price'},
others : {$push : '$$ROOT'}
}
},
{
$unwind : '$others'
},
{
$project : {
_id : '$others._id',
name : '$others.name',
key: '$others.key',
price: '$others.price',
pricecmp : {$cmp : ['$maxVal', '$others.price']}
}
},
{
$match : {pricecmp : {$eq : 0}}
}
])
这将是输出
{
"_id" : "555232",
"name" : "Something or another",
"key" : "B",
"price" : 78,
"pricecmp" : 0
}
{
"_id" : "323232",
"name" : "Something",
"key" : "A",
"price" : "100",
"pricecmp" : 0
}
答案 1 :(得分:0)
我怀疑你可以使用一个阶段返回所有结果。就我的知识进行扩展而言,聚合会创建另一个带有结果的集合(如果我错了,希望其他人会纠正我)。您将获得最高价格和密钥,然后使用它来检索整个文档。
获取每个密钥的最高价格;这是你如何做到的:
db.collection.aggregate([{ $group:{ _id: "$key", maxprice:{$max:"$price"} } }])
<强>更新强>
评论中建议的link实际上使用$ sort和$ match,它也适用于你。
希望有所帮助