【发布时间】:2014-03-08 07:36:26
【问题描述】:
在我查询的 MongoDB 集合中,每个文档代表特定时间的一个项目。更新文档时,会创建一个具有相同项目 ID 和新时间戳的新文档。所有项目都有唯一的项目 ID。
为了说明,考虑这个例子。我们从一个项目的一个修订开始:
{
_id: x,
itemId: 123,
createdOn: ISODate("2013-01-30T11:16:20.102Z"),
field1: "foo",
field2: "bar
}
更新后,我们有两个版本的项目,具有相同的 itemId 和不同的时间戳。
[{
_id: x,
itemId: 123,
createdOn: ISODate("2013-01-30T11:16:20.102Z"),
field1: "foo",
field2: "bar"
},
{
_id: y,
itemId: 123,
createdOn: ISODate("2014-02-09T14:26:20.102Z"),
field1: "baz",
field2: "fiz"
}]
如何找到在其最新修订版中满足特定查询的所有项目?
我目前(错误)的做法是先找到匹配的文档,然后按时间戳排序,按itemId分组,然后从组中的第一个文档返回值:
ItemModel.aggregate({ $match: { field1: "foo"} }).sort({createdOn: -1}).group(
{
_id: '$itemId', // grouping key
createdOn: {$first: '$createdOn'},
field1: {$first: '$field1'},
field2: {$first: '$field2'}
}).exec(...);
这是错误的,因为它匹配项目的旧版本。只有项目的最新版本应该匹配。在上面的示例中,此方法返回项目“123”,而正确的结果是一个空结果集。
【问题讨论】:
标签: mongodb mongoose mongodb-query aggregation-framework