分组,然后在Mongo DB中展开记录

时间:2016-05-16 21:02:19

标签: mongodb aggregation-framework

我在集合中有以下数据。

> db.person.find().pretty()
{
        "_id" : ObjectId("573a30a9dcf15c037f943f27"),
        "name" : "Mark",
        "age" : 30,
        "country" : "US"
}
{
        "_id" : ObjectId("573a30b9dcf15c037f943f28"),
        "name" : "John",
        "age" : 34,
        "country" : "FR"
}
{
        "_id" : ObjectId("573a30d1dcf15c037f943f29"),
        "name" : "Rodrigo",
        "age" : 23,
        "country" : "IT"
}
{
        "_id" : ObjectId("573a3194dcf15c037f943f2a"),
        "name" : "Steve",
        "age" : 23,
        "country" : "US"
}

我试图找出每个国家中最年长者的文件。例如,以下内容应该是上述数据的结果。

{
        "_id" : ObjectId("573a30a9dcf15c037f943f27"),
        "name" : "Mark",
        "age" : 30,
        "country" : "US"
}
{
        "_id" : ObjectId("573a30b9dcf15c037f943f28"),
        "name" : "John",
        "age" : 34,
        "country" : "FR"
}
{
        "_id" : ObjectId("573a30d1dcf15c037f943f29"),
        "name" : "Robert",
        "age" : 23,
        "country" : "IT"
}

我尝试使用聚合但它没有帮助。实际上是否可以在Mongo DB中执行此类操作?如果是,请分享解决方案。

1 个答案:

答案 0 :(得分:2)

如果我理解你,你实际上可以做到这一点。你要做的是按国家分组并选择最高年龄。

这样的事可能有用:

db.person.aggregate([
  {$sort: {country: 1, age: 1}},
  {$group: 
      {_id: "$country",
       doc_id: {$last: "$_id"},
       age: {$last: "$age"},
       name: {$last: "$name"}}
  }
])

这将为您提供最高的文件,其中包含具有与国家/地区相对应的ID的文档,并包括原始文档的所有信息。您可以在组之后向管道添加任何内容,例如,如果要将文档重新整形为具有不同的属性名称。