获取每个用户的最新文档集

时间:2014-03-25 02:14:56

标签: mongodb mongodb-query aggregation-framework

我需要在集合中为每个用户获取最新文档。例如,假设我有这样的数据:

[
    { 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,但它似乎并不是我正在寻找的正确答案。如何查询此数据?

1 个答案:

答案 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的时间戳,因为它的值也会一直增加。