如何解决需要有关 mongo 聚合查询的帮助
以下是示例数据:
[{
"outdoor": {
"location": {
"type": "Point","coordinates": [
-92.41151,35.11683
]
}
},"geoHash": "dr72jwgnbbst","status":"Active","customerId":"8047380094","locationId":"A0"
},{
"outdoor": {
"location": {
"type": "Point","coordinates": [
-89.58342,36.859161
]
}
},"geoHash": "dn6qtkr5xk8m","status":"Pending","locationId":"A1"
},{
"outdoor": {
"location": {
"type": "Point","coordinates": [
-86.038762,36.519016
]
}
},"geoHash": "dn6zf0h6xtcp","locationId":"A2"
},"coordinates": [
-98.3081936,26.2143207
]
}
},"geoHash": "9udj4unjmp9f","locationId":"A3"
},"coordinates": [
-98.5377275,29.4878928
]
}
},"geoHash": "9v1zv8p52t8u","locationId":"A4"
},"coordinates": [
-73.7018126,42.641387
]
}
},"geoHash": "dreddfeup69m","locationId":"A5"
},"coordinates": [
-111.865295,33.431942
]
}
},"geoHash": "9tbqnqn5jtwq","locationId":"A6"
},"coordinates": [
-79.810763,34.174603
]
}
},"geoHash": "dnp4rv796rtz","locationId":"A7"
}
]
目前我们正在运行 2 个查询:
查询 1 - 此查询将按按 geoHash 子字符串分组的状态提供计数。
db.locations.aggregate([{"$match": {"customerId": "8047380094"}},{"$project": {"status": 1,"geoHash": {"$substr": ["$geoHash",2]}}},{"$group": {"_id": {"geoHash": "$geoHash","status": "$status"},"statusCount": {"$sum": 1}}}],{
"allowdiskUse": true
});
输出 1:
{ "_id" : { "geoHash" : "dr","status" : "Active" },"statusCount" : 1 }
{ "_id" : { "geoHash" : "dr","status" : "Pending" },"statusCount" : 1 }
{ "_id" : { "geoHash" : "dn","statusCount" : 2 }
{ "_id" : { "geoHash" : "dn","statusCount" : 1 }
{ "_id" : { "geoHash" : "9u","statusCount" : 1 }
{ "_id" : { "geoHash" : "9v","statusCount" : 1 }
{ "_id" : { "geoHash" : "9t","statusCount" : 1 }
查询 2 - 我们有一个查询来获取 geohash 组的第一个位置坐标。
db.locations.aggregate([{"$match": {"customerId": "8047380094"}},{"$project": {"geoHash": {"$substr": ["$geoHash",2]},"locations": "$outdoor.location.coordinates"}},{"$group": {"_id": "$geoHash","locations": {"$push": "$locations"}}},{"$project": {"_id": 1,"locations": {"$arrayElemAt": ["$locations",0]}}}],{
"allowdiskUse": true
});
输出 2:
{ "_id" : "dr","locations" : [ -92.41151,35.11683 ] }
{ "_id" : "dn","locations" : [ -89.58342,36.859161 ] }
{ "_id" : "9u","locations" : [ -98.3081936,26.2143207 ] }
{ "_id" : "9v","locations" : [ -98.5377275,29.4878928 ] }
{ "_id" : "9t","locations" : [ -111.865295,33.431942 ] }
问题 1: 是否可以将两个查询合并为 1 并在单个查询中获得两个输出?
问题 2: 如果总计数为 1(不是按状态),我们还需要获取 locationId 吗?我们如何在同一个查询中实现这一点? 在上述情况下, 对于“9u”,我们需要返回 A3 对于“9v”,我们需要返回 A4 对于“9t”,我们需要返回 A6
注意:我们在 spring mongo 中使用 spring boot 应用程序。
解决方法
我没有按照您尝试实现的目标进行操作,因为问题没有提及它。但是对于你们两个问题,我都可以回答
- 您可以使用
$facet
创建多个聚合管道 - 通过使用第一个
$facet
阶段,您可以使用额外的阶段来获取您的 locationId;
这是代码
{
$project: {
firstQuery: 1,secondQuery: {
$map: {
input: "$secondQuery",as: "s",in: {
$mergeObjects: [
"$$s",{
$arrayElemAt: [
{
$map: {
input: {
$filter: {
input: "$firstQuery",as: "f",cond: { $eq: ["$$f._id.geoHash","$$s._id" ] }
}
},in: { locationId: "$$this.locationId" }
}
},0
]
}
]
}
}
}
}
}
注意:确保 { $eq: ["$$f._id.geoHash","$$s._id" ] }
将给出一个独特的对象。否则需要另一个想法。而且我觉得您发布的两个查询更像是相同的。所以可以有一个简单的解决方案。但我是根据你发布的问题回答的
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。