每个项目 mongodb 组的最新记录(按日期)

Posted

技术标签:

【中文标题】每个项目 mongodb 组的最新记录(按日期)【英文标题】:Latest record by date for each item mongodb group 【发布时间】:2015-04-03 09:24:37 【问题描述】:

集合中有许多项目,每个项目都有许多记录,有些记录新日期,有些记录一周或/和一个月。我需要一个返回每个项目的最新最后记录的查询。在 .aggregate() 的情况下,我需要提交完整的“数据”。我想要这个结果使用 mongodb $group,每个设备的记录应该是最新的。

   
    "result" : [ 
        
            "_id" : 29,
            "gateway_id" : 1,
            "data" : [ 
                
                    "r" : 203,
                    "v" : 3002
                , 
                
                    "r" : 221,
                    "v" : 3006
                
            ],
            "device_id" : 29,
            "date_time" : "a"
        , 
        
            "_id" : 28,
            "gateway_id" : 1,
            "data" : [ 
                
                    "r" : 203,
                    "v" : 3002
                , 
                
                    "r" : 221,
                    "v" : 3006
                
            ],
            "device_id" : 28,
            "date_time" : "b"
        , 
        
            "_id" : 27,
            "gateway_id" : 1,
            "data" : [ 
                
                    "r" : 203,
                    "v" : 3642
                , 
                
                    "r" : 221,
                    "v" : 3666
                
            ],
            "device_id" : 27,
            "date_time" : "a"
        
    ],
    "ok" : 1

我希望使用 mongodb $group 得到这个结果,每个设备的记录应该是最新的。

【问题讨论】:

【参考方案1】:

试试下面的sn-p

db.collection.aggregate([
    $group: 
        "_id": "$device_id",
        "gateway_id": "$last":"$gateway_id",
        "data": "$last": '$data',
        "date": "$last": '$date_time',
    ,
    $project: 
        "device_id": "$_id",
        "gateway_id": "$gateway_id",
        "data": "$data",
        "date_time": "$date"
    ,
    $sort: 
        "date": -1
    
]);

在上面按设备id和日期的查询组中,数据和gateway_id在每一行都是最新的。

【讨论】:

我认为如果你把排序放在第一位,你可以从索引中受益 $last 仅在文档​​处于定义顺序时才有意义 docs.mongodb.com/manual/reference/operator/aggregation/last【参考方案2】:

我的回答是半相关的,但我要加入 convo 是因为我在寻找这个时登陆了这里。我想对字段 email 上的唯一列表进行分组,并返回在该组中找到的第一个文档,类似于 SQL 不同的查询。

      client
        .collection('email_list')
        .aggregate([

          // group documents unique by "email" field, add a new prop "doc" with the full document of the first doc found in the DB
           $group:  _id: '$email', doc:  $first: '$$ROOT'   ,

          // replace the "root" document with the first document found in the DB
           $replaceRoot:  newRoot: '$doc'  ,

        ])
        .toArray()

【讨论】:

以上是关于每个项目 mongodb 组的最新记录(按日期)的主要内容,如果未能解决你的问题,请参考以下文章

如何在Postgres中按年月按最大(日期)组获取行?

Django - 从每个组的最新日期检索对象 - PersonPhoto

oracle 查询每组的最大值

获取每个组的最新 n 条记录

根据最大日期获取每组的最新行

如何使用实体框架和 MySQL 获取每个组的最新记录,包括相关实体