【问题标题】:Retrieving the last record in each group - MongoDB检索每个组中的最后一条记录 - MongoDB
【发布时间】:2020-02-10 16:27:18
【问题描述】:

有一个包含以下字段的项目集合:

id   item_id  quantity    last_update
-------------------------------------------
1    111         10        2020-02-10 09:00:00
2    222         10        2020-02-10 09:00:00
2    222         15        2020-02-10 10:00:00

我想通过 id 和 item_id 检索每个组的最后更新记录。 结果应该是:

id   item_id  quantity    last_update
-------------------------------------------
1    111         10        2020-02-10 09:00:00
2    222         15        2020-02-10 10:00:00

如果是 SQL ,那么我会这样做:

SELECT a.* FROM items a JOIN
( SELECT id ,item_id , max(last_update) as max_last_update
FROM items ) as b ON a.id=b.id AND a.item_id=b.item_id AND a.last_update=b.max_last_update

(或使用自连接)。

我是 mongoDB 新手,我做了如下内部查询:

inner_query = db.items.aggregate({ $group : { _id: {id:"$id" , item_id:"$item_id"}, max_last_update: { $max : "$last_update" }}})

如何使用 inner_query var 来获得预期的结果? Mongo 中的 JOIN 或子查询等价于什么? (我使用的是 mongodb 4.0.4)

谢谢!

【问题讨论】:

  • 当你说“每个组的最后更新记录由 id 和 item_id”那么你应该得到所有三个文档。
  • 您不需要自联接 - 无论是在 SQL 还是在 MongoDB 中

标签: mongodb mongodb-query


【解决方案1】:

试试这个:

db.collection.aggregate([
   { $sort: { id: 1, item_id: 1, last_update: -1 } },
   {
      $group: {
         _id: { id: "$id", item_id: "$item_id" },
         last_update: { $max: "$last_update" },
         quantity: { $first: "$quantity" },
      }
   },
   {
      $project: {
         last_update: 1,
         quantity: 1,
         id: "$_id.id",
         item_id: "$_id.item_id",
         _id: 0
      }
   }
])

注意,$sort要正确,否则$frist会返回错误值。

【讨论】:

    猜你喜欢
    • 2010-11-21
    相关资源
    最近更新 更多