2015-12-02 2 views
3

Моя структура документа, как следующее:

{ agency_key : '', 
    route_id: '', 
    direction_id: '', 
    stops: [ 
      {stop_id:15, 
      stop_lat: '', 
      stop_lon: '', 
      loc: [-83.118972, 42, 121567] 
      }, 
      {... 
      } 
      ] 
} 

Я хочу найти остановки, которые близки к данным (широта, долгота) пары в заданном расстоянии от каждого документа в коллекции. Я создал 2d-индексы. Я попробовал $ unwind, затем $ geoNear, но он говорит, что $ geoNear может быть только на первом этапе конвейера. Я попытался это:

db.tm_stops.aggregate([ 
... { 
... $geoNear: { near: {coordinates: [-82.958841, 42.370114] },  distanceField: "stops.calculated", query: { agency_key: "DDOT"}, 
... includeLocs: "stops.loc" } 
... } 
... ]) 

Я попытался следующие:

db.tm_stops.find({stops:{$near:[-82.958841, 42.370114], $maxDistance: 1 } }) 

Он бросает эту ошибку:

error: { 
    "$err" : "Unable to execute query: error processing query: ns=gtfs.tm_stops limit=0 skip=0\nTree: GEONEAR field=stops maxdist=1 isNearSphere=0\nSort: {}\nProj: {}\n planner returned error: unable to find index for $geoNear query", 
    "code" : 17007 

Что должно быть моим Монго запроса? Мне нужно выполнить это из приложения Node.js, но я хочу сначала увидеть результат в Mongo shell. Заранее спасибо.

ответ

2

Я, наконец, сделал запрос работы. Я отвечаю на свой вопрос для будущей справки. Поскольку я использую 2d-индекс, а не 2dsphere, мне не нужно было использовать coordinates в ближайшем операторе. Этот запрос работает:

db.tm_stops.aggregate([ 
{ 
    $geoNear: 
    { near: [-82.958841, 42.370114] ,  
    distanceField: "stops.calculated", 
    query: { agency_key: "DDOT"}, 
    includeLocs: "stops.loc" } 
    } 
    ]) 

Но я обнаружил, в возвращенном документе, я могу видеть только вычисленное расстояние и (долгота, широта) пара используется для вычисления расстояния. Я действительно не могу вернуть весь встроенный документ, который используется для расчета.

Если я найду способ вернуть весь внедренный документ, я обновлю свой ответ.

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