需要有关 mongo 聚合查询的帮助

如何解决需要有关 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 应用程序。

解决方法

我没有按照您尝试实现的目标进行操作,因为问题没有提及它。但是对于你们两个问题,我都可以回答

  1. 您可以使用 $facet 创建多个聚合管道
  2. 通过使用第一个 $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
                ]
              }
            ]
          }
        }
      }
    }
  }

工作Mongo playground

注意:确保 { $eq: ["$$f._id.geoHash","$$s._id" ] } 将给出一个独特的对象。否则需要另一个想法。而且我觉得您发布的两个查询更像是相同的。所以可以有一个简单的解决方案。但我是根据你发布的问题回答的

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?