我在集合中有以下数据。
> 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中执行此类操作?如果是,请分享解决方案。
答案 0 :(得分:2)
如果我理解你,你实际上可以做到这一点。你要做的是按国家分组并选择最高年龄。
这样的事可能有用:
db.person.aggregate([
{$sort: {country: 1, age: 1}},
{$group:
{_id: "$country",
doc_id: {$last: "$_id"},
age: {$last: "$age"},
name: {$last: "$name"}}
}
])
这将为您提供最高的文件,其中包含具有与国家/地区相对应的ID的文档,并包括原始文档的所有信息。您可以在组之后向管道添加任何内容,例如,如果要将文档重新整形为具有不同的属性名称。