返回按几何体分组的MongoDB结果

时间:2015-02-03 03:47:11

标签: mongodb mapreduce aggregation-framework geojson

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

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

我已经阅读了geoSpatial运算符,聚合框架和mapReduce功能,但我不能完全看到它们在这个特定实例中如何组合在一起。

谢谢!

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

正如所指出的,听起来像是需要加入,但我们的朋友mongo不可能。然而,mongos易于创建(和丢弃)表/集合是制作临时(或perm)olap表的理想选择,这些表适用于最终查询目的。反对重组可能已经与初始业务案例匹配的集合架构。以joining 2 collections为开头。你可以使用crap-reduce或mongo shell脚本来构建那些olap集合。这两种方法都是slow,不适用于justintime分析。我还会看一下这篇关于20x perf的帖子。