我的用例非常简单:我在mongodb中有一组文档,地理坐标指定为GeoJSON Point。
我想找到这个集合的边界框,定义为lat min,long min,lat max,long max。
文件具有以下结构:
{
"_id": ObjectId("538ed354b83897b4418b4567"),
"name": "example point",
"description": "",
"location": {
"type": "Point",
"coordinates": [
24.501885327447624,
42.228924279974158
]
},
"status": "1",
"type": "image"
}
经过大量的搜索和反复试验后,我陷入了困境。
我发现了一些很好的工作方法,它们适用于具有键/值对的子文档(数组),但到目前为止,我还没有找到任何普通数组,例如GeoJSON坐标对。
通过聚合,我面临的问题是我无法从GeoJSON点提取X,Y坐标(尝试使用$slice: [0,1]
和$slice: [1,1]
,但这似乎不适用于{{ 1}}管道)。 Unwind似乎也不是正确的方法。
对于RDMS中真正基本的查询,Map / reduce看起来有点过分。
什么是我最好的方法(最新的mongodb版本2.6.3)?
答案 0 :(得分:4)
正确的方法是$unwind
,因为“切片”和“位置预测”目前无效$project
或$group
。因此,MongoDB 2.6版本中没有提供任何改变方法的新内容:
但实际上您需要两个$group
阶段才能从“坐标”数组中获取$first
和$last
,然后将这些传递到$min
和{ {3}}:
db.geoobj.aggregate([
{ "$unwind": "$location.coordinates" },
{ "$group": {
"_id": "$_id",
"lat": { "$first": "$location.coordinates" },
"lon": { "$last": "$location.coordinates" }
}},
{ "$group": {
"_id": null,
"minLat": { "$min": "$lat" },
"minLon": { "$min": "$lon" },
"maxLat": { "$max": "$lat" },
"maxLon": { "$max": "$lon" }
}}
])
生成表示集合的最小和最大点边界的四个坐标。您可以使用诸如$max
之类的运算符来获得更好的效果并将其转换为“多边形”表示,但实际上这是另一个问题。