每个项目mongodb组的最新记录

时间:2015-04-03 09:24:38

标签: mongodb

集合中有许多项目,每个项目都有很多记录,有些项目有新日期记录,有些项目有较长的周/月。我需要一个查询返回每个项目的最新记录。在.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获得此结果,每个设备的记录应该是最新的。

2 个答案:

答案 0 :(得分:2)

尝试使用以下代码段

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将在每一行中最新。

答案 1 :(得分:2)

我的回答是半相关的,但我正在添加到会议中,因为我在寻找这个时登陆了这里。我想对字段 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()