【问题标题】:Latest record by date for each item mongodb group每个项目 mongodb 组的最新记录(按日期)
【发布时间】: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 得到这个结果,每个设备的记录应该是最新的。

【问题讨论】:

    标签: mongodb


    【解决方案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在每一行都是最新的。

    【讨论】:

    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-22
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2021-04-22
      • 1970-01-01
      相关资源
      最近更新 更多