首页 文章

如何从mongodb上的聚合中获取完整的文档

提问于
浏览
1

我的收藏“人物”中有以下数据:

{"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文档几个小时找不到解决方案 .

如果有人能够纠正我的查询以达到我的需要,我会很高兴 .

2 回答

  • 1

    除非 $first 遵循 $sort ,否则 $first 运算符不是很有用 . 您可以通过将聚合管道更改为以下内容来实现所需的输出:

    db.people.aggregate([
        {
            $sort: { age: 1 }
        },
        {
            $group: {
                _id:"$name",
                age: {$first:"$age"},
                city : { $first: "$city" }
            }
         }
    ]);
    
  • 1

    在对数据进行分组之前对数据进行排序有一个解决方案:

    db.people.aggregate( [
        { $sort : { "age" : 1 } },
        { $group:{
            _id:"$name", 
            "age": {$min:"$age"}, 
            city : { $first: "$city" }
                }
        }
    

    ]);

    但是,在大型数据集的情况下,排序可能不起作用 . 现在,如果这篇文章对某人有帮助,我会很高兴 .

相关问题