检索每个组中的最后一条记录 - MongoDB

Posted

技术标签:

【中文标题】检索每个组中的最后一条记录 - MongoDB【英文标题】:Retrieving the last record in each group - 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 中 【参考方案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会返回错误值。

【讨论】:

以上是关于检索每个组中的最后一条记录 - MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

检索每个组中的最后一条记录 - MySQL

检索每个组中的最后一条记录 - MySQL

检索每个组中的最后一条记录 - MySQL

检索每个组中的最后一条记录 - MySQL

检索每个组中的最后一条记录 - MySQL

检索每个组中的最后一条记录 - MySQL