Mongodb:查找数组中的项目及其最后一条记录

时间:2017-09-28 08:05:01

标签: mongodb

我有很多设备记录,每条记录都有deviceID,data,updatetime ...... 有一个deviceArray包含一些deviceID。 我想在数组中找到所有设备记录,但只显示最后更新的记录。

我尝试这个查询:

collection.find({ 'deviceID': { $in: deviceArray }},{ _id: 0, }).sort({ $natural: -1 }).limit(1).toArray(function (err, devicedata) {
                            console.log(devicedata);
                        });    

但它只显示一条记录......

我在官方网站上搜索$ last(聚合),但我不需要使用群组命令..

我希望结果像

[{deviceID:1 , data:xxx, updatetime:xxx},
{deviceID:2 , data:xxx, updatetime:xxx},
{deviceID:3 , data:xxx, updatetime:xxx},
]

当我的devicearray是[1,2,3]

我该如何查询?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用此脚本。

db.collection.aggregate( [
    { $match: { "deviceID" : { $in: [1,2,3] }} },
    { $sort : { "deviceID" :-1, "updatetime" : -1 } },
    {
        $group: 
        {
            _id: {deviceID:"$deviceID" }, 
            lastUpdatedRecord: 
            { 
                $first:  
                { 
                    deviceID: "$deviceID", 
                    data: "$data", 
                    updatetime: "$updatetime" 
                } 
            }
        }
    },
    {
        $replaceRoot: { newRoot: "$lastUpdatedRecord" }
    }
 ]).toArray(function (err, devicedata) {
                            console.log(devicedata);
                        }); 

对于此示例数据:

{
    "_id" : ObjectId("59ea53cc5d430def261c0622"),
    "updatetime" : ISODate("2017-09-22T06:37:17.620Z"),
    "deviceID" : 1.0,
    "data" : "AAAAAAA"
}
{
    "_id" : ObjectId("59ea53cc5d430def261c0623"),
    "updatetime" : ISODate("2017-09-22T06:42:17.620Z"),
    "deviceID" : 2.0,
    "data" : "BBBBBBB"
}
{
    "_id" : ObjectId("59ea53cc5d430def261c0624"),
    "updatetime" : ISODate("2017-09-22T06:45:17.620Z"),
    "deviceID" : 3.0,
    "data" : "CCCCCCC"
}
{
    "_id" : ObjectId("59ea53cc5d430def261c0625"),
    "updatetime" : ISODate("2017-09-24T06:50:17.620Z"),
    "deviceID" : 1.0,
    "data" : "DDDDDDD"
}

结果:

[
    {
        "deviceID" : 1.0,
        "data" : "DDDDDDD",
        "updatetime" : ISODate("2017-09-24T06:50:17.620Z")
    },
    {
        "deviceID" : 2.0,
        "data" : "BBBBBBB",
        "updatetime" : ISODate("2017-09-22T06:42:17.620Z")
    },
    {
        "deviceID" : 3.0,
        "data" : "CCCCCCC",
        "updatetime" : ISODate("2017-09-22T06:45:17.620Z")
    }
]