MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

комбиниране на заявка geoNear с друга заявка за стойност

Стига вашият 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 запазва метода си като "обвивка" за една от тези форми е неизвестно, но е малко вероятно, така че е по-добре да се придържате към поддържаните форми.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Използване на mongodb за съхраняване на данни за собствения капитал в рамките на деня

  2. MongoDB $и операторска заявка в PHP

  3. не може да стартира контейнер mongoDb в докер за Windows, използвайки файлова система на linux

  4. MongoDB заявка за връщане само на вграден документ

  5. DeprecationWarning:Слушането на събития в класа Db е отхвърлено и ще бъде премахнато в следващата основна версия