我对使用数据库很陌生,我需要查询给定的mongoDB。数据存储在这样的文档中:
{
"_id" : ObjectId("5b7d2aac59a5020e18762be2"),
"configId" : "5b7d29f659a5020e18762be1",
"deviceId" : 1,
"timestamp" : 700,
"posX" : 5,
"posY" : 12,
"valueId" : 1,
"value" : 310.24
}
我需要的是每个configId,每个deviceId,每个valueId的最新文档(时间戳最高的文档)。
我的第一个想法是按时间戳对它们进行排序,然后以某种方式使用聚合函数对数据进行分组。但是我无法找到按多个键分组的示例。 稍后我可以在应用程序中过滤数据,但我认为应该采用“蒙哥式”的方式。
感谢您提供任何建议,这些建议使我更接近可行的“蒙哥式”解决方案,
答案 0 :(得分:0)
您可以按多个键$group
分组例如:
{"$group" : {"_id" : {"configId" : "$configId","deviceId" : "$deviceId"},---do what you want ($sum or $push etc..)--}}
在这里,我有2个数据,分别带有两个不同的时间戳700和900。它可以正常检查。
我的数据
/* 1 */
{
"_id" : ObjectId("5b7d2aac59a5020e18762be2"),
"configId" : "5b7d29f659a5020e18762be1",
"deviceId" : 1.0,
"timestamp" : 700.0,
"posX" : 5.0,
"posY" : 12.0,
"valueId" : 1.0,
"value" : 310.24
}
/* 2 */
{
"_id" : ObjectId("5b7d619994983bedbfda191f"),
"configId" : "5b7d29f659a5020e18762be1",
"deviceId" : 1.0,
"timestamp" : 900.0,
"posX" : 5.0,
"posY" : 12.0,
"valueId" : 1.0,
"value" : 310.24
}
这是我的查询
db.col.aggregate([
{"$sort" : {"timestamp" : -1}},
{"$group" : {"_id" :
{"configId" : "$configId","deviceId" : "$deviceId","valueId" : "$valueId"},
"data" : {"$first" : "$$ROOT"}
}
}
])
这是我的输出
{
"_id" : {
"configId" : "5b7d29f659a5020e18762be1",
"deviceId" : 1.0,
"valueId" : 1.0
},
"data" : {
"_id" : ObjectId("5b7d619994983bedbfda191f"),
"configId" : "5b7d29f659a5020e18762be1",
"deviceId" : 1.0,
"timestamp" : 900.0,
"posX" : 5.0,
"posY" : 12.0,
"valueId" : 1.0,
"value" : 310.24
}
}