我的“人物”系列中包含以下数据:
{"name" : "Anton", "age" : 22, "city" : "New York"}
{"name" : "Anton", "age" : 21, "city" : "London"}
{"name" : "Anton", "age" : 20, "city" : "Berlin"}
{"name" : "Berta", "age" : 20, "city" : "Berlin"}
我希望Mongo给每个名字最年轻的人1个及其所有属性(整个文件) - 这是:
{"name" : "Anton", "age" : 20, "city" : "Berlin"}
{"name" : "Berta", "age" : 20, "city" : "Berlin"}
使用以下查询:
db.people.aggregate( [
{
$group:{
_id:"$name",
"age": {$min:"$age"},
city : { $first: "$city" }
}
}
] );
Mongo会给我:
{"_id" : "Anton", "age" : 20, "city" : "New York"} // Wrong City
{"_id" : "Berta", "age" : 20, "city" : "Berlin"}
由于我使用“$ first”作为城市属性,Mongo选择了“Anton”组中第一个人的城市,但是最年轻的Anton城市。 (我在结果中使用“_id”而不是“name”。)
我无法通过谷歌搜索和拖网Mongo文档数小时找到解决方案。
如果有人能够纠正我的查询以达到我的需要,我会很高兴。
答案 0 :(得分:1)
通过在对数据进行分组之前对数据进行排序,有一种解决方案:
db.people.aggregate( [
{ $sort : { "age" : 1 } },
{ $group:{
_id:"$name",
"age": {$min:"$age"},
city : { $first: "$city" }
}
}
]);
但是,对于庞大的数据集,排序可能不起作用。现在,如果这篇文章对某人有帮助,我会很高兴。
答案 1 :(得分:1)
$first
运算符除非遵循$sort
,否则不是很有用。您可以通过将聚合管道更改为:
db.people.aggregate([
{
$sort: { age: 1 }
},
{
$group: {
_id:"$name",
age: {$first:"$age"},
city : { $first: "$city" }
}
}
]);