我有一个 mongoDB 集合,如下所示:
[
{user: "joe", event: "foo", timestamp: 1},
{user: "meg", event: "blah", timestamp: 2},
{user: "rick", event: "bork", timestamp: 3},
{user: "joe", event: "bing", timestamp: 4},
{user: "meg", event: "biz", timestamp: 5},
{user: "tim", event: "boz", timestamp: 6}
]
并且我想找到每个用户的最新事件,因此获得一组结果,例如:
[
{user: "rick", event: "bork", timestamp: 3},
{user: "joe", event: "bing", timestamp: 4},
{user: "meg", event: "biz", timestamp: 5},
{user: "tim", event: "boz", timestamp: 6}
]
我查看了猫鼬聚合框架文档,似乎应该有一种方法可以简单地做到这一点,但我见过的示例都没有完全做到这一点。 其中很多都是按用户分组的,但是结果分组会丢失一些数据,而且我不知道最后如何重建完整的文档。
$setWindowFields
- 按 user
字段对文档进行分区/分组,并按 timestamp
降序对每个分区进行排序,并使用 rank
运算符添加
$rank
字段。
$match
- 使用 rank: 1
过滤文档表示获取每个分区的最新时间戳。
$sort
- 按 timestamp
升序排列文档。
$unset
- 从文档中删除 rank
字段。
db.collection.aggregate([
{
$setWindowFields: {
partitionBy: "$user",
sortBy: {
timestamp: -1
},
output: {
rank: {
$rank: {}
}
}
}
},
{
$match: {
rank: 1
}
},
{
$sort: {
timestamp: 1
}
},
{
$unset: "rank"
}
])