从mongodb geojson点集合中查找最大,最小坐标值

时间:2014-08-05 12:15:36

标签: mongodb geolocation mongodb-query aggregation-framework

我的用例非常简单:我在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)?

1 个答案:

答案 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之类的运算符来获得更好的效果并将其转换为“多边形”表示,但实际上这是另一个问题。