我有很多设备记录,每条记录都有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]
时我该如何查询?谢谢你的帮助。
答案 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")
}
]