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

use*_*267 7 mongodb

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

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
Run Code Online (Sandbox Code Playgroud)

期望的结果

group_id date
1        11/3/12
2        11/1/12
3        11/3/12
Run Code Online (Sandbox Code Playgroud)

Ste*_*nie 6

您可以使用$max聚合框架中的分组功能查找每个的最新文档group_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));
});
Run Code Online (Sandbox Code Playgroud)

示例结果:

{
    "_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"
}
Run Code Online (Sandbox Code Playgroud)

  • @Stennie谢谢,这太好了!但是,$ max id选择不应该选择最高_id而不是$ max日期的doc的id?订购在这里重要吗? (2认同)