2015-11-23 2 views
5

Когда я увольняю этот запрос на MongoDB, я получаю все места вблизи 500 миль к указанным координатам. Но я хочу знать точное расстояние между указанными координатами и местоположением результата.MongoDB печать расстояние между двумя точками

db.new_stores.find({ "geometry": { $nearSphere: { $geometry: { type: "Point", coordinates: [ -81.093699, 32.074673 ] }, $maxDistance: 500 * 3963 } } }).pretty() 

Мой выход выглядит следующим образом:

{ 
    "_id" : ObjectId("565172058bc200b0db0f75b1"), 
    "type" : "Feature", 
    "geometry" : { 
     "type" : "Point", 
     "coordinates" : [ 
      -80.148826, 
      25.941116 
     ] 
    }, 
    "properties" : { 
     "Name" : "Anthony's Coal Fired Pizza", 
     "Address" : "17901 Biscayne Blvd, Aventura, FL" 
    } 
} 

Я также хочу знать расстояние этого места от указанной координаты. Я создал индекс 2dsphere по геометрии.

ответ

9

Вы можете использовать совокупный этап трубопровода $geoNear производить на расстоянии от запрошенной точки:

db.new_stores.aggregate([ 
    { "$geoNear": { 
     "near": { 
      "type": "Point", 
      "coordinates": [ -81.093699, 32.074673 ] 
     }, 
     "maxDistance": 500 * 1609, 
     "spherical": true, 
     "distanceField": "distance", 
     "distanceMultiplier": 0.000621371 
    }} 
]).pretty() 

Это позволяет указать "distanceField", который будет производить еще одно поле в выходных документах, содержащих расстояние от запрашиваемая точка. Вы можете также использовать "distanceMultiplier" для applyany преобразования в выходном расстояние по мере необходимости (т.е. метров до мили, отметив, что все расстояния GeoJSON возвращаются в метрах)

Существует также geoNear команды с аналогичными опциями, но это, конечно, делает не возвращать курсор в качестве вывода.

+0

Большое спасибо, он отлично работает. Любопытно узнать, почему вы умножили его на 1609? – SiMemon

+1

@SiMemon Потому что есть 1609 метров в миле, и наоборот/на дистанционном мультипликаторе. Номер 3963, который вы использовали, - это преобразование «радиан» в мили, которое при использовании с точками координат GeoJSON было бы неверным. Радианы используются только с хранилищем, а запрос использует «устаревшие координатные пары». –

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