使用聚合框架,获取每个分组最大字段值的文档的最佳方法是什么,因此使用下面的集合我希望能够为每个具有最新日期的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)
您可以使用$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)
| 归档时间: |
|
| 查看次数: |
4034 次 |
| 最近记录: |