如何使用 typescript 和 mongoose 选择 MongoDB 中每种记录类型的最后一条记录

问题描述 投票:0回答:1

我有一个 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}
]

我查看了猫鼬聚合框架文档,似乎应该有一种方法可以简单地做到这一点,但我见过的示例都没有完全做到这一点。 其中很多都是按用户分组的,但是结果分组会丢失一些数据,而且我不知道最后如何重建完整的文档。

javascript typescript mongodb mongoose
1个回答
0
投票
  1. $setWindowFields
    - 按
    user
    字段对文档进行分区/分组,并按
    timestamp
    降序对每个分区进行排序,并使用
    rank
     运算符添加 
    $rank
    字段。

  2. $match
    - 使用
    rank: 1
    过滤文档表示获取每个分区的最新时间戳。

  3. $sort
    - 按
    timestamp
    升序排列文档。

  4. $unset
    - 从文档中删除
    rank
    字段。

db.collection.aggregate([
  {
    $setWindowFields: {
      partitionBy: "$user",
      sortBy: {
        timestamp: -1
      },
      output: {
        rank: {
          $rank: {}
        }
      }
    }
  },
  {
    $match: {
      rank: 1
    }
  },
  {
    $sort: {
      timestamp: 1
    }
  },
  {
    $unset: "rank"
  }
])

演示@Mongo Playground

© www.soinside.com 2019 - 2024. All rights reserved.