2015-11-23 24 views
5

Wenn ich diese Abfrage auf MongoDB feuere, bekomme ich alle Orte in der Nähe von 500 Meilen zu den angegebenen Koordinaten. Aber ich möchte den genauen Abstand zwischen den angegebenen Koordinaten und dem Ergebnisort wissen.MongoDB Druckabstand zwischen zwei Punkten

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

Meine Ausgabe wie folgt aussieht:

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

ich die Entfernung dieses Ortes von der angegebenen Koordinate auch wissen wollen. Ich habe den 2Dsphere-Index für die Geometrie erstellt.

Antwort

9

Sie die $geoNear Aggregat Pipeline-Stufe in einem Abstand von dem abgefragten Punkt zu erzeugen, verwenden können:

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

Diese Sie "distanceField" angeben können, die den Abstand von dem anderen Feld in den Ausgabedokumenten produzieren enthalten abgefragter Punkt. Sie können auch "distanceMultiplier" verwenden Umwandlung in die Ausgängen Abstand applyany nach Bedarf (dh m Meilen, und unter Hinweis darauf, dass alle GeoJSON Entfernungen in Metern zurückgegeben)

Es gibt auch den geoNear Befehl mit ähnlichen Optionen, aber es natürlich tun gib keinen Cursor als Ausgabe zurück.

+0

Vielen Dank, es funktioniert perfekt. Neugierig zu wissen, warum hast du es 1609 vervielfacht? – SiMemon

+1

@SiMemon Weil es 1609 Meter in einer Meile sind, und umgekehrt auf dem AbstandMultiplier. Die von Ihnen verwendete 3963-Nummer ist die Umwandlung von "Radianten" in Meilen, die bei Verwendung mit GeoJSON-Punktkoordinaten nicht korrekt sind. Radianten werden nur mit Speicher und Abfrage verwendet "Legacy-Koordinatenpaare". –

Verwandte Themen