mongodb地理定位索引和查询

Posted

技术标签:

【中文标题】mongodb地理定位索引和查询【英文标题】:mongodb geolocation indexing and quering 【发布时间】:2012-06-04 06:37:08 【问题描述】:

我有以下 mongo 文档结构。


"geo": 
  "0": 
    "deliveryArea": 
     "0": 
       "lat": 50.449234773334,
       "lng": 30.52300029031
    ,
     "1": 
       "lat": 50.449234773334,
       "lng": 30.52542980606
    ,
     "2": 
       "lat": 50.45154573136,
       "lng": 30.52542980606
    ,
     "3": 
       "lat": 50.45154573136,
       "lng": 30.52300029031
    
  ,
   "title": "Kiev, ....",
   "coords": 
     "lat": "50.4501",
     "lngt": "30.523400000000038"
  ,
   "wholeCityDelivery": "false"

问题:

    如何确保deliveryArea [lat,lng] 中每个元素的insure_index 用于地理位置g? 如何构建查询以查找具有点 N[lat,lng] in(belongs to) polygon deliveryArea.$的文档

如果你会做 php - 请)

谢谢!

【问题讨论】:

【参考方案1】:

首先,您需要更改数据结构。 MongoDB 想要“经度,纬度”,它不关心你给字段取什么名字——一般来说,我会在没有字段名的情况下使用它们。您还需要在没有“0”键的情况下存储文档

比如:


    "geo": 
        "deliveryArea": [
             [ 30.52300029031, 50.449234773334 ],
        ]
    

然后你需要在“geo.deliveryArea”上设置一个二维索引:

$collection->ensureIndex( array( "geo.deliveryArea" => "2d" ) );

有关如何构建查询的信息可以在http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-BoundsQueries 但是,在您的情况下,您希望找到一个点的交付区域,而不是检查存储的点是否适合给定区域,而 MongoDB 不能直接这样做因为它的二维索引只能存储点。 请在http://jira.mongodb.org提出功能请求

【讨论】:

因为名称无关紧要,通常不建议使用 loc:[,] 代替对象格式吗?

以上是关于mongodb地理定位索引和查询的主要内容,如果未能解决你的问题,请参考以下文章

RethinkDB - 优化执行地理定位、然后加入、然后分组的查询

mongoDb地理空间索引和查询

MongoDB 地理定位与 Spring MVC 一起使用

使用 $near 和 2d 索引的 Mongo 地理定位不准确

MongoDB系列五(地理空间索引与查询).

为啥mongodb返回地理索引错误?