Mongodb查询:每个项目按日期的最新记录

时间:2015-03-31 11:59:28

标签: mongodb record

集合中有六个设备,每个设备都有许多记录,一些记录有新日期,一些记录有一周或/和一个月的旧记录。我需要一个查询返回每个设备的最新记录。在.aggregate()的情况下,我需要完整的数据"于此。

以下是json示例。

{
"date_time" : some-date
"device_id" : 27,
"gateway_id" : 1,
"data": [{"r" : 203,"v" : 3642},{"r" : 221,"v" : 3666}]
}
{
"date_time" : some-date
"device_id" : 28,
"gateway_id" : 1,
"data": [{"r" : 203,"v" : 3002},{"r" : 221,"v" : 3006}]
}
{
"date_time" : some-date
"device_id" : 29,
"gateway_id" : 1,
"data": [{"r" : 203,"v" : 3002}, {"r" : 221,"v" : 3006}]
}

我尝试了很多查询但没有成功。

请注意以下情况不适用于此案。

db.col.find({"device_id": {"$in": devices}, "date_time": { "$gte": last_date}}) .sort({$natural: -1})

db.col.find({"device_id": {"$in": devices}, "date_time": { "$gte": last_date}}) .sort({$natural: -1}).limit(1)

db.col.find({"device_id": {"$in": devices}}) .sort({"date_time": -1}).limit(1)

db.col.find({"device_id": {"$in": devices}}) .sort({"_id": -1}).limit(1)

我正在寻找只提供集合中每个设备的最新记录的查询。请注意,在.aggregate()的情况下,我需要完整的数据"于此。

2 个答案:

答案 0 :(得分:11)

尝试使用以下代码段

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

输出 -

{
    "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
}

由于

答案 1 :(得分:0)

使用findOne代替find查询 db.collection.findOne({})