2015-11-23 14 views
5

Kiedy odpalam to zapytanie na MongoDB, otrzymuję wszystkie miejsca w odległości 500 mil od podanych współrzędnych. Ale chcę znać dokładną odległość między określonymi współrzędnymi i lokalizacją wyniku.MongoDB odległość drukowania między dwoma punktami

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

moje wyjście wygląda następująco:

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

Ja też chcę wiedzieć odległość tego miejsca od podanej współrzędnej. Stworzyłem indeks 2dsphere na geometrii.

Odpowiedz

9

Można użyć $geoNear łączną fazę realizacji produkować odległość od odpytywany punkcie:

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

Pozwala to na określenie "distanceField" który przyniesie kolejne pole w dokumentach wyjściowych zawierających odległość od pytany punkt. Można również użyć "distanceMultiplier" do applyany konwersję do odległości wyjściowej wymagane (tj metrów na mile i zauważając, że wszystkie odległości GeoJSON są zwracane w metrach)

Istnieje również komenda geoNear z podobnych opcji, ale to oczywiście nie nie zwraca kursora jako wyniku.

+0

Wielkie dzięki, działa idealnie. Ciekawi Cię, dlaczego pomnożyłeś go przez 1609? – SiMemon

+1

@SiMemon Ponieważ jest 1609 metrów na milę, i vice/versa na odległościMultiplier. Numer 3963, którego używałeś, to przekształcenie "radianów" na mile, które w przypadku współrzędnych punktu GeoJSON byłyby nieprawidłowe. Radian stosuje się tylko z pamięcią masową, a zapytanie wykorzystuje "starsze pary współrzędnych". –

Powiązane problemy