【问题标题】:Extracting a large number of fields for each document in a MongoDB aggregation query为 MongoDB 聚合查询中的每个文档提取大量字段
【发布时间】:2015-01-08 01:21:20
【问题描述】:

我有一个 MongoDB 集合。其中,每个文档都有一个项目 ID、一个时间字段和大量其他字段。项目 ID 重复。我想从这个集合中的最后一个文档中为每个不同的项目 ID 提取所有数据。一种可行的方法如下:

db.items.aggregate({
    $sort: {time: -1}}, {
    $group: {
        _id: {item: '$item.id'},
        time: {$first: '$time'},
        anotherField: {$first: '$anotherField'},
        yetAnotherField: {$first: '$yetAnotherField'},
        ...
    }
})

...但是,我需要为要提取的文档中的每个字段添加一个表达式,这非常笨拙。是否有一个查询可以像上述那样在计算上高效(或更好)但更优雅地完成此任务?

【问题讨论】:

  • 您的问题是“最后一个文档”,但您的示例代码使用了$first,那么它是什么? :)
  • @JohnnyHK,他说{ "$sort": { "time": -1 } }。因此,在使用$first 时订购到“最后”时间。假设除分组键之外的每个字段都是$first。那么这里的问题究竟是什么?您不想输入所有内容吗?
  • @NeilLunn 是的,大概就是这样。
  • 我同意$$ROOT 是处理此问题的简单方法,即使它确实会稍微改变文档。但是你总是可以这样编码,因为你的应用程序“应该”真的有一些预期模式的概念,而这一切都只是遍历并生成数据结构。您几乎不应该像这样“手动输入”查询。
  • 是的,@NeilLunn,问题是我不想全部输入。

标签: mongodb


【解决方案1】:

您可以使用$$ROOT 引用$group 中的整个文档。

因此,要获取每个组的最新(即最后一个)文档,您可以这样做:

db.items.aggregate({
    $sort: {time: -1}}, {
    $group: {
        _id: {item: '$item.id'},
        lastDoc: {$first: '$$ROOT'}
    }
})

【讨论】:

  • 我不得不升级到 2.6,但这正是我所需要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-07-15
  • 2014-10-12
  • 2020-10-10
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
相关资源
最近更新 更多