Finché il tuo server MongoDB è abbastanza recente, essendo una versione 2.6 o successiva, questa funzionalità è stata effettivamente spostata nel motore di query generale. Il metodo mongoose qui avvolge .runCommand()
modulo che è considerato deprecato per tutte le versioni future, quindi si tratta solo di inserire una query standard con operatori aggiuntivi.
GeoLocation.find({
"$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)]
},
"$maxDistance": distanceInMeters
},
"loc.type": "Point"
},function(err,docs) {
// The documents are also mongoose document objects as well
});
Vedi ulteriori opzioni su $nearSphere
o altri operatori per le opzioni. La differenza principale qui è $maxDistance
è in metri quando viene utilizzato un modulo GeoJSON, anziché in radianti dove altrimenti.
C'è ovviamente anche il $geoNear
operatore per la pipeline di aggregazione. Questo è disponibile a partire da MongoDB 2.4 e può richiedere altre opzioni come una "query" per restringere ulteriormente i risultati. L'altro possibile vantaggio qui è che "proietterà" un campo nei risultati che rappresenta la "distanza" dal punto della query. Questo può essere utilizzato in altri calcoli o nell'ordinamento personalizzato:
GeoLocation.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)]
},
"distanceField": "distance",
"maxDistance": distanceInMeters,
"spherical": true,
"query": { "loc.type": "Point" }
}},
{ "$sort": { "distance": -1 } } // Sort nearest first
],
function(err,docs) {
// These are not mongoose documents, but you can always cast them
}
);
Altre differenze da notare sono che nel modulo di query standard i risultati non sono più limitati a 100 documenti come nel modulo "comando". L'aggregazione $geoNear
limiti a 100 documenti come risultati per impostazione predefinita, ma il numero di documenti restituiti può essere ottimizzato con un'opzione "limite" aggiuntiva al comando pipeline. L'istruzione aggregata non "ordina" i risultati diversi dal numero massimo di documenti da restituire dalla ricerca sono i primi risultati date le condizioni, ma non vengono restituiti in ordine, quindi dovresti ordinarli come mostrato.
In entrambi i casi dovresti spostare il codice per utilizzare uno di questi moduli poiché il modulo di comando è considerato deprecato e verrà rimosso in futuro. Non è noto se l'API mongoose mantenga il suo metodo come "wrapper" per uno di questi moduli, ma per lo più improbabile, quindi è meglio attenersi ai moduli supportati.