mongodb - 按多个“键”分组
问题描述
我对使用数据库很陌生,我需要查询给定的 mongoDB。数据存储在这样的文档中:
{
"_id" : ObjectId("5b7d2aac59a5020e18762be2"),
"configId" : "5b7d29f659a5020e18762be1",
"deviceId" : 1,
"timestamp" : 700,
"posX" : 5,
"posY" : 12,
"valueId" : 1,
"value" : 310.24
}
我需要的是每个 configId、每个 deviceId、每个 valueId 的最新文档(时间戳最高的文档)。
我的第一个想法是按时间戳对它们进行排序,然后以某种方式使用聚合函数对数据进行分组。但是我无法找到按多个键分组的示例。稍后我可以在我的应用程序中过滤我的数据,但我认为应该有一种“mongo 风格”的方式来做到这一点。
感谢任何让我更接近工作“mongo-style”解决方案的建议,
解决方案
您可以按多个键分组 $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
}
}
推荐阅读
- r - 使用 SSL/TLS 启动 Rserve 实例?
- rest - REST API:POSTing 客户端应该如何了解关联的 id?
- mysql - 无法启动 Mysql (MariaDB)
- string - ShellScript 解析 sting 变量以通知发送
- java - Pivotal GemFire 9.3.0:GemFire 集群中的 Spring Data GemFire XML 配置
- parse-server - 在解析服务器日志中查看失败登录尝试的源 IP 地址
- javascript - 点击 Puppeteer 后检测 POST 响应到达
- c# - 反射方法调用对象与目标类型不匹配
- angular - IFrame 有时无法在 IE11 中运行
- javascript - 伊斯坦布尔纽约市包括测试文件