【问题标题】:Aggregating by a field and selecting the document with the max value of another field as a collection按一个字段聚合,选择另一个字段最大值的文档作为集合
【发布时间】:2013-01-24 15:03:11
【问题描述】:

使用聚合框架,获取每个分组的字段最大值的文档的最佳方法是什么,因此使用下面的集合,我希望具有为每个 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

期望的结果

group_id date
1        11/3/12
2        11/1/12
3        11/3/12

【问题讨论】:

  • 我知道这不是您想要的,但您可以遍历组 id,并执行以下操作:db.foo.find( { group_id : n } ).sort( { date : -1 } ).limit( 1 ) -- 对于每个 group_id = n。这将按日期对具有给定组 id 的所有文档进行排序,然后仅返回最近的文档。

标签: mongodb


【解决方案1】:

您可以使用聚合框架中的$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));
});

示例结果:

{
    "_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"
}

【讨论】:

  • 谢谢,那么我如何将这些作为具有最大日期的整个文档?我应该在分组后进行投影并明确抓取所有字段吗?
  • 分组将合并文档,这可能不是您想要的。我更新了示例以使用聚合框架来查找最新文档 _ids,并使用 $in 查询来获取完整文档。
  • @Stennie 谢谢,太好了!但是 $max id 选择不应该只选择最高的 _id 而不是 $max 日期的文档的 id 吗?在这里订购重要吗?
  • @Timothy055:你是对的.. 我添加了_id 选择作为快速编辑,这仅在最大_id 与最大date 相关时才有效。已更新为使用$group 的结果作为查找匹配文档的标准的更通用方法。
猜你喜欢
  • 2023-02-11
  • 2017-07-12
  • 1970-01-01
  • 2019-10-25
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多