2015-11-23 50 views
5

Quando sto sparando questa query su MongoDB, sto ottenendo tutti i posti in prossimità di 500 miglia alle coordinate specificate. Ma voglio sapere la distanza esatta tra le coordinate specificate e la posizione del risultato.MongoDB stampa la distanza tra due punti

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

mia uscita assomiglia:

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

Vorrei anche conoscere la distanza di questo luogo dalla coordinare specificato. Ho creato l'indice 2dsphere sulla geometria.

risposta

9

È possibile utilizzare l'aggregato fase $geoNear pipeline per produrre una distanza dal punto interrogato: si

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

Questo permette di specificare "distanceField" che produrrà un altro campo nei documenti di output che contengono la distanza dal punto interrogativo È inoltre possibile utilizzare "distanceMultiplier" per applyany conversione alla distanza di uscita come richiesto (vale a dire i metri in miglia, e notando che tutte le distanze di GeoJSON vengono restituiti in metri)

C'è anche il comando geoNear con opzioni simili, ma ovviamente fa non restituisce un cursore come output.

+0

Grazie mille, funziona perfettamente. Curioso di sapere perché lo hai moltiplicato per il 1609? – SiMemon

+1

@SiMemon Perché ci sono 1609 metri in un miglio e vice/versa sulla distanzaMultiplier. Il numero 3963 che stavate usando è la conversione di "radianti" in miglia, che se usate con coordinate punto GeoJSON sarebbero errate. I radianti vengono utilizzati solo con storage e query utilizzano "coppie di coordinate legacy". –

Problemi correlati