Dokud je váš server MongoDB dostatečně aktuální, jedná se o verzi 2.6 nebo vyšší, byla tato funkce ve skutečnosti přesunuta do obecného dotazovacího stroje. Metoda mongoose zde obaluje .runCommand()
formulář, který je považován za zastaralý pro všechna budoucí vydání, takže jde pouze o zadání standardního dotazu s dalšími operátory.
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
});
Podívejte se na další možnosti na $nearSphere
nebo jiných operátorů. Hlavním rozdílem je zde $maxDistance
je v metrech, když je použit tvar GeoJSON, spíše než v radiánech, kde je jinak.
K dispozici je samozřejmě také $geoNear
operátor pro agregační kanál. To je k dispozici od MongoDB 2.4 a může použít další možnosti, jako je „dotaz“, k dalšímu zúžení výsledků. Další možnou výhodou je, že do vašich výsledků „promítne“ pole představující „vzdálenost“ od bodu dotazu. To lze použít při jiných výpočtech nebo vlastním třídění:
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
}
);
Další rozdíly, které je třeba poznamenat, jsou, že ve standardním formuláři dotazu již nejsou výsledky omezeny na 100 dokumentů, jako je tomu ve formuláři „příkaz“. Agregace $geoNear
ve výchozím nastavení omezuje na 100 dokumentů, ale počet vrácených dokumentů lze vyladit pomocí další možnosti „limit“ k příkazu potrubí. Souhrnný příkaz „netřídí“ výsledky jinak než z maximálního počtu dokumentů, které mají být vráceny z vyhledávání, jsou to nejlepší výsledky za daných podmínek, ale nejsou vráceny v pořadí, takže je budete muset seřadit podle obrázku.
V obou případech byste měli přesunout svůj kód tak, aby používal některý z těchto formulářů, protože příkazový formulář je považován za zastaralý a bude v budoucnu odstraněn. Zda si mongoose API zachová svou metodu jako "obal" pro jednu z těchto forem, není známo, ale většinou nepravděpodobné, takže je lepší držet se podporovaných formulářů.