Стига вашият MongoDB сървър да е достатъчно актуален, като е версия 2.6 или по-нова, тогава тази функционалност всъщност е преместена в общата машина за заявки. Методът mongoose тук обвива .runCommand()
форма, която се счита за остаряла за всички бъдещи версии, така че е просто въпрос на поставяне на стандартна заявка с допълнителни оператори.
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
});
Вижте допълнителни опции на $nearSphere
или други оператори за опции. Основната разлика тук е $maxDistance
е в метри, когато се използва формуляр GeoJSON, а не в радиани, където иначе.
Разбира се, има и $geoNearкод>
оператор за тръбопровода за агрегиране. Това е налично от MongoDB 2.4 и може да използва други опции, като например „заявка“, за да стесните допълнително резултатите. Другото възможно предимство тук е, че ще "проектира" поле във вашите резултати, представляващо "разстоянието" от точката на заявката. Това може да се използва при други изчисления или персонализирано сортиране:
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
}
);
Други разлики, които трябва да се отбележат, са, че в стандартния формуляр за заявка резултатите вече не са ограничени до 100 документа, както са в „командния“ формуляр. Агрегацията $geoNear
ограничава до 100 документа като резултати по подразбиране, но броят на върнатите документи може да се настрои с допълнителна опция "лимит" към командата за конвейер. Обобщителната декларация не „сортира“ резултатите, освен от максималния брой документи, които да се върнат от търсенето, са най-добрите резултати при условията, но те не се връщат по ред, така че ще трябва да ги сортирате, както е показано.
И в двата случая трябва да преместите кода си, за да използвате някоя от тези форми, тъй като командната форма се счита за остаряла и ще бъде премахната в бъдеще. Дали приложният програмен интерфейс (API) на mongoose запазва метода си като "обвивка" за една от тези форми е неизвестно, но е малко вероятно, така че е по-добре да се придържате към поддържаните форми.