【发布时间】: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