Mongodb 按字段聚合并选择另一个字段最大值的文档作为集合

Mongodb 按字段聚合并选择另一个字段最大值的文档作为集合,mongodb,Mongodb,使用聚合框架,获取每个分组的最大字段值的文档的最佳方法是什么?因此,使用下面的集合,我希望能够为每个具有最新日期的组返回一个文档。第二个清单显示了所需的结果 group_id date 1 11/1/12 1 11/2/12 1 11/3/12 2 11/1/12 3 11/2/12 3 11/3/12 期望结果 group_id date 1 11/3/12 2 11/1/1

使用聚合框架,获取每个分组的最大字段值的文档的最佳方法是什么?因此,使用下面的集合,我希望能够为每个具有最新日期的组返回一个文档。第二个清单显示了所需的结果

group_id date 
1        11/1/12  
1        11/2/12
1        11/3/12
2        11/1/12
3        11/2/12
3        11/3/12
期望结果

group_id date
1        11/3/12
2        11/1/12
3        11/3/12
您可以使用聚合框架中的分组功能查找每个
组id
的最新文档。您将需要其他查询来根据分组条件检索完整文档

var results = new Array();
db.groups.aggregate(
    // Find documents with latest date for each group_id
    { $group: {
        _id: '$group_id',
        date: { $max: '$date' },
    }},
    // Rename _id to group_id, so can use as find criteria
    { $project: {
        _id: 0,
        group_id:'$_id',
        date: '$date'
    }}
).result.forEach(function(match) {
    // Find matching documents per group and push onto results array
    results.push(db.groups.findOne(match));
});
示例结果:

{
    "_id" : ObjectId("5096cfb8c24a6fd1a8b68551"),
    "group_id" : 1,
    "date" : ISODate("2012-11-03T00:00:00Z"),
    "foo" : "bar"
}
{
    "_id" : ObjectId("5096cfccc24a6fd1a8b68552"),
    "group_id" : 2,
    "date" : ISODate("2012-11-01T00:00:00Z"),
    "foo" : "baz"
}
{
    "_id" : ObjectId("5096cfddc24a6fd1a8b68553"),
    "group_id" : 3,
    "date" : ISODate("2012-11-03T00:00:00Z"),
    "foo" : "bat"
}

我知道这并不是您想要的,但是您可以遍历组id,并执行如下操作:db.foo.find({group_id:n}).sort({date:-1}).limit(1)--对于每个组{u id=n。这将按日期对具有给定组id的所有文档进行排序,然后只返回最近的一个。谢谢,那么如何将这些文档作为具有最大日期的整个文档?我是否应该在分组后投影并显式获取所有字段?分组将合并文档,这可能不是您想要的。我已经更新了示例,使用聚合框架查找最新的文档
\u id
s,并在
查询中使用
$in
获取完整文档。@Stennie谢谢,这太棒了!但是$max id选项不应该只选择最高的id,而不是带有$max日期的文档的id吗?订购在这里重要吗?@Timothy055:你说得对。。我添加了
\u id
选项作为快速编辑,只有当max
\u id
与max
日期相关时,这才有效。已使用更通用的方法进行更新,该方法使用
$group
的结果作为查找匹配文档的标准。