我有一个mongodb,用于存储IoT设备的历史数据。 mongo db上的文档是这样的:
"_id": {
"$oid": "5c5f97b9fd01ff005ab5a101"
},
"temperature": -1,
"datetime": 1549768633858,
"deviceId": 4085799
}
"_id": {
"$oid": "5c5f97b9fd01ff005ab5a102"
},
"temperature": -27,
"datetime": 1549768633863,
"deviceId": 4085587
}
我想找到每个设备的最新文档。我正在使用以下查询
db.getCollection("sensors").find(
{
"deviceId" : {
"$in" : [
4085799,
4085587
]
}
}
)
).limit(2);
它仅返回两个文档,但是如果数据库中不存在其中一个设备,我将找到与该设备重复的结果。 例如,如果4085799不存在,我会得到
{
"_id" : ObjectId("5c75b5a3f8d4d0005d90e1bf"),
"temperature" : NumberInt(-27),
"datetime" : 1551218083021.0,
"deviceId" : NumberInt(4085587)
}
// ----------------------------------------------
{
"_id" : ObjectId("5c75b21ff8d4d0005d90e1b8"),
"temperature" : NumberInt(-27),
"datetime" : 1551217183157.0,
"deviceId" : NumberInt(4085587)
}
// ----------------------------------------------
如果deviceId = 4085799不在数据库中,我怎么只能得到一个结果?
答案 0 :(得分:0)
使用Aggregation(mongoDB 3.6或更高版本),您可以找到每个设备的最后一个文档。
db.sensors.aggregate([
{ $sort: { _id: -1 } },
{ $group: {
_id: "$deviceId",
id: { $first: "$_id" },
temperature: { $first: "$temperature" },
deviceId: { $first: "$deviceId" },
datetime: { $first: "$datetime" }
}
}
])