我需要在集合中为每个用户获取最新文档。例如,假设我有这样的数据:
[
{ user: "bob", time: ISODate("Sat, 24 Mar 2012 05:52:21 +0000"), value: "a" },
{ user: "bob", time: ISODate("Sun, 25 Mar 2012 05:52:21 +0000"), value: "b" },
{ user: "joe", time: ISODate("Sat, 24 Mar 2012 05:52:21 +0000"), value: "c" },
{ user: "bob", time: ISODate("Mon, 26 Mar 2012 05:52:21 +0000"), value: "d" },
{ user: "joe", time: ISODate("Sun, 25 Mar 2012 05:52:21 +0000"), value: "e" }
]
查询后,我想取回这些条目:
[
{ user: "bob", time: ISODate("Mon, 26 Mar 2012 05:52:21 +0000"), value: "d" },
{ user: "joe", time: ISODate("Sun, 25 Mar 2012 05:52:21 +0000"), value: "e" }
]
我在这里看到了这个问题:MongoDB Map-Reduce Find Values from Last Record per User,但它似乎并不是我正在寻找的正确答案。如何查询此数据?
答案 0 :(得分:4)
您可以使用$last
运算符和.aggregate()
方法执行此操作:
db.collection.aggregate([
{ "$sort": { "user": 1, "time": 1 } },
{ "$group": {
"_id": "$user",
"time": { "$last": "$time" },
"value": { "$last": "$value" }
}}
])
因此,您从分组边界获取" last" 项目以返回值。在大多数情况下,使用$last
之后才真正有意义,但是为了增加这样的插入,可能会排除这个阶段。
可能值得注意的是,您也可以使用_id
值代替$sort
的时间戳,因为它的值也会一直增加。