【问题标题】:How to get a complete document from aggregation on mongodb如何从 mongodb 上的聚合中获取完整的文档
【发布时间】:2016-05-11 15:02:50
【问题描述】:

我的集合“人”中有以下数据:

{"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 文档,我找不到解决方案。

如果有人可以更正我的查询以达到我的需要,我会很高兴。

【问题讨论】:

  • 我在最初的帖子中已经这样做了。 ` {“name”:“Anton”,“age”:20,“city”:“Berlin”} {“name”:“Berta”,“age”:20,“city”:“Berlin”}`忘记了什么?
  • 不,抱歉,我错过了。
  • 确保在这篇帖子@AndréGräf 上接受答案
  • 对不起,我是 SFO 菜鸟... 完成 :)

标签: mongodb


【解决方案1】:

$first 运算符不是很有用,除非它跟在 $sort 后面。您可以通过将聚合管道更改为:

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

【讨论】:

    【解决方案2】:

    有一个解决方案是先对数据进行排序再分组:

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

    ]);

    但是,如果数据集很大,排序可能不起作用。现在,如果这篇文章对某人有所帮助,我很高兴。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-09
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多