2012-06-04 2 views
0

У меня есть следующий монго документ структура.mongodb геолокация индексирование и запрос

{ 
"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" 
} 

Вопросы:

  1. Как ensure_index для каждого элемента в deliveryArea [лат, LNG] для geolocationg?
  2. Как построить запрос, чтобы найти документы с точки N [лат, LNG] в (принадлежит) многоугольник deliveryArea $

Если вы можете сделать PHP -. Пожалуйста)

Спасибо!

ответ

3

Прежде всего, вам необходимо изменить структуру данных. MongoDB хочет «долготу, рельефность», и все равно, какие имена вы даете полям - в общем, я бы использовал их без имен полей. Кроме того, необходимо сохранить документ без "0" ключи

Так как:

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

Затем вам необходимо установить индекс 2D на "geo.deliveryArea": ​​

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

Информация о том, как создавать запросы, может быть в http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-BoundsQueries Однако в вашем случае вы хотите найти область доставки для точки, вместо того, чтобы проверять, соответствуют ли сохраненные точки в заданной области, а MongoDB не может сделать это напрямую, поскольку только его индекс 2d может магазин точки. Пожалуйста, запросите функцию в http://jira.mongodb.org

+0

Из имен не mattering, не так, как правило, рекомендуется использовать ВХ [, ] вместо формата объекта? –

+0

Да, спасибо Уэсу. Я обновил ответ. – Derick

Смежные вопросы