是否可以在MongoDB中查询集合并返回按几何边界分组的结果?例如,我有一个地址集合,每个地址都有一个lat / long定义为GeoJSON Point。我还有一系列市议会病房,每个病房都有一个GeoJSON MultiPolygon对象来定义它的边界。有没有办法查询wards
集合,以便我的结果填充一个显示每个病房中地址总数的字段?
相反,是否可以查询addresses
集合并将我的结果填入每个地址所在的病房?
我已经阅读了geoSpatial运算符,聚合框架和mapReduce功能,但我不能完全看到它们在这个特定实例中如何组合在一起。
谢谢!
答案 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的帖子。