【问题标题】:Return MongoDB results grouped by geometry返回按几何分组的 MongoDB 结果
【发布时间】:2015-02-03 03:47:11
【问题描述】:

是否可以在 MongoDB 中查询一个集合并返回按几何边界分组的结果?例如,我有一组地址,每个地址都有一个定义为 GeoJSON 点的纬度/经度。我还有一组市议会病房,每个病房都有一个 GeoJSON MultiPolygon 对象定义其边界。有没有办法查询wards 集合,以便在我的结果中填充一个显示每个病房地址总数的字段?

相反,是否可以查询addresses 集合并使用每个地址所在的病房填充我的结果?

我已经阅读了 geoSpatial 运算符、聚合框架和 mapReduce 功能,但我只是不太明白它们在这个特定实例中如何结合在一起。

谢谢!

【问题讨论】:

    标签: mongodb mapreduce aggregation-framework geojson


    【解决方案1】:

    对于第一个问题,我使用了 $geoWithin 运算符。了解病房坐标后,您可以使用 $geoWithin 对地址集合进行查询,该查询适用于 multiPolygons。

    db.addresses.find(
    {
       addressCoordinates: {
          $geoWithin: {
              $geometry: {
                 type: "MultiPolygon" ,
                 coordinates: [ /*ward coordinates*/ ]
              }
          }
       }
    });
    

    http://docs.mongodb.org/manual/reference/operator/query/geoWithin/#op._S_geoWithin


    对于第二个问题,如果病房和地址是两个单独的集合,彼此之间没有单向或双向引用,那么您说的是表连接,而 mongoDB 不支持。我能想到的唯一方法是在您的代码中执行此操作,如果我错了,请纠正我。

    另一种解决方案是重组您的病房或地址集合架构,以便其中一个引用另一个。地址示例:

    {
        "name": "Trafalgar square",
        "coordinates": [/*your coordinates*/],
        "ward": ObjectId("5fbd....") // ward's ObjectID
    }
    

    【讨论】:

    • 谢谢。实际上,我最终选择了另一种方式,并在病房文档上制作了一个地址 objectIds 数组。它更适合我的特殊要求。
    【解决方案2】:

    正如所指出的,听起来我们的朋友 mongo 需要加入,但不可能。但是,mongo 易于创建(和丢弃)表/集合非常适合制作适合最终查询目的的临时(或永久)olap 表。反对重组可能已经匹配初始业务案例的集合模式。首先查看joining 2 collections。您可以使用 crap-reduce 或 mongo shell 脚本来构建这些 olap 集合。这两种方法都是slow,不适用于justintime 分析。我也会看看这篇关于20x perf 的帖子。

    【讨论】:

    • 感谢您的彻底回复。 Aza 的解决方案最终适合我,所以我接受了那个,但我投了你的票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2021-08-06
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多