Zolang uw MongoDB-server recent genoeg is en een versie van 2.6 of hoger is, is deze functionaliteit feitelijk verplaatst naar de algemene query-engine. De mangoestmethode hier wikkelt de .runCommand()
formulier dat als verouderd wordt beschouwd voor alle toekomstige releases, dus het is gewoon een kwestie van een standaardquery met extra operators plaatsen.
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
});
Zie meer opties op $nearSphere
of andere operators voor opties. Het belangrijkste verschil hier is $maxDistance
is in meters wanneer een GeoJSON-vorm wordt gebruikt, in plaats van radialen waar anders.
Er is natuurlijk ook de $geoNear
operator voor de aggregatiepijplijn. Dit is beschikbaar vanaf MongoDB 2.4 en kan andere opties gebruiken, zoals een "query" om de resultaten verder te verfijnen. Het andere mogelijke voordeel hier is dat het een veld in uw resultaten "projecteert" dat de "afstand" vanaf het vraagpunt vertegenwoordigt. Dit kan worden gebruikt in andere berekeningen of aangepaste sortering:
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
}
);
Andere verschillen om op te merken zijn dat in het standaardqueryformulier de resultaten niet langer beperkt zijn tot 100 documenten zoals in het "commando"-formulier. De aggregatie $geoNear
beperkt standaard tot 100 documenten als resultaat, maar het aantal geretourneerde documenten kan worden aangepast met een extra "limiet"-optie voor het pijplijncommando. De geaggregeerde instructie "sorteert" de resultaten niet, behalve van de maximale documenten die moeten worden geretourneerd uit de zoekopdracht zijn de topresultaten onder de voorwaarden, maar ze worden niet in volgorde geretourneerd, dus u zou ze moeten sorteren zoals weergegeven.
In beide gevallen moet u uw code verplaatsen om een van deze formulieren te gebruiken, aangezien het opdrachtformulier als verouderd wordt beschouwd en in de toekomst zal worden verwijderd. Of de mangoest-API zijn methode behoudt als een "wrapper" voor een van deze formulieren is onbekend, maar meestal onwaarschijnlijk, dus het is beter om bij de ondersteunde formulieren te blijven.