2016-09-21 4 views
0

У меня есть коллекция под названием «остановки», в которой хранится информация о координатах. Я использовал индекс MongoDB 2dsphere для поиска мест. Например, я хочу, чтобы запросить все остановки вокруг определенной позиции с помощью db.runCommand:MongoDB Nested RunCommand

db.runCommand({ geoNear: "stops", near: { type: "Point" , coordinates: [ -123.115115, 49.209659 ] }, spherical: true, minDistance: 0, maxDistance: 200, })

Результатом является JSON массив:

{ "waitedMS" : NumberLong(0), "results" : [ { "dis" : 79.0147493688595, "obj" : { "_id" : ObjectId("57e2349b9d0263463a3e93aa"), "zone_id" : "ZN 99", "coordinate" : [ -123.116116, 49.209383 ], "stop_id" : 11252, "stop_code" : 61338, "stop_url" : "", "stop_desc" : "MARINE DRIVE STATION LOOP @ BAY 2", "stop_name" : "MARINE DRIVE STN BAY 2", "location_type" : 0, "parent_station" : "" } }, { "dis" : 140.73823410181, "obj" : { "_id" : ObjectId("57e2349b9d0263463a3eaec9"), "zone_id" : "ZN 1", "coordinate" : [ -123.117038, 49.209801 ], "stop_id" : 11286, "stop_code" : "", "stop_url" : "", "stop_desc" : "SKYTRAIN @ MARINE DRIVE STN", "stop_name" : "MARINE DRIVE STATION", "location_type" : 0, "parent_station" : "" } } ], "stats" : { "nscanned" : 14, "objectsLoaded" : 2, "avgDistance" : 123.782109714949, "maxDistance" : 140.73823410181, "time" : 1 }, "ok" : 1.0 }

Мне интересно, мы можем сделать вложенный runCommand для дальнейшего фильтра результата будет выглядеть как

{"results" : [ { "dis" : 79.0147493688595, "obj" : { "coordinate" : [ -123.116116, 49.209383 ], "stop_id" : 11252, "stop_code" : 61338, "stop_desc" : "MARINE DRIVE STATION LOOP @ BAY 2", "stop_name" : "MARINE DRIVE STN BAY 2", } }, { "dis" : 140.73823410181, "obj" : { "coordinate" : [ -123.117038, 49.209801 ], "stop_id" : 11286, "stop_code" : "", "stop_desc" : "SKYTRAIN @ MARINE DRIVE STN", "stop_name" : "MARINE DRIVE STATION", } } ] }

Существует много бесполезной информации в оригинальной реакции json.

+0

Вместо 'runCommand' начать пытаться с' aggregate', как: db.stops.aggregate ([{ $ geoNear: { вблизи: {типа: "Точка", координаты: [-123,115115, 49,209659]}, сферический: правда, minDistance: 0, maxDistance: 200, } }]) –

+0

@DiegoZoracKy Спасибо ! Я пробовал это. И возвращаем: «errmsg»: «$ geoNear требует опции« distanceField »как String», «Я думаю, что значение после geoNear должно быть именем коллекции – Ev3rlasting

+1

Да, в этом случае ему нужно' distanceField'. Взгляните сюда: https://docs.mongodb.com/manual/reference/operator/aggregation/geoNear/ –

ответ

1

Использовать aggregate вместо runCommand. Это было бы как:

db.stops.aggregate([{ 
    $geoNear: { 
     near: { type: "Point", coordinates: [-123.115115, 49.209659] }, 
     spherical: true, 
     minDistance: 0, 
     maxDistance: 200, 
     distanceField: 'someDistanceFieldProperty' 
    } 
}]); 

Взгляните на документы для Вас, чтобы идти дальше: https://docs.mongodb.com/manual/reference/operator/aggregation/geoNear/

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