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

kbj*_*bjr 0 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" }
]
Run Code Online (Sandbox Code Playgroud)

查询后,我想找回这些条目:

[
    { 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" }
]
Run Code Online (Sandbox Code Playgroud)

我在这里看到了这个问题:MongoDB Map-Reduce从每个用户的上一条记录中查找值,但这似乎并不是我要找的正确答案。如何查询该数据?

Nei*_*unn 5

您可以将$last运算符与.aggregate()方法配合使用来执行此操作:

db.collection.aggregate([
    { "$sort": { "user": 1, "time": 1 } },
    { "$group": {
        "_id": "$user",
        "time": { "$last": "$time" },
        "value": { "$last": "$value" }
    }}
])
Run Code Online (Sandbox Code Playgroud)

因此,您将从分组边界中获取“最后一个”项目以返回值。采用$last一种在大多数情况下,但是对于越来越像这样的阶段,大概可以排除插入后真的才有意义。

可能值得注意的是,您也可以使用该_id值代替时间戳,$sort因为它的值也总是会增加。