MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

połączyć zapytanie geoNear z innym zapytaniem o wartość

Tak długo, jak twój serwer MongoDB jest wystarczająco nowy, ponieważ jest w wersji 2.6 lub nowszej, ta funkcjonalność została faktycznie przeniesiona do ogólnego silnika zapytań. Metoda mangoose opakowuje .runCommand() formularz, który jest uważany za przestarzały we wszystkich przyszłych wydaniach, więc wystarczy umieścić standardowe zapytanie z dodatkowymi operatorami.

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
});

Zobacz dalsze opcje na $nearSphere lub innych operatorów dla opcji. Główną różnicą jest tutaj $maxDistance jest w metrach, gdy używana jest forma GeoJSON, a nie w radianach, gdzie jest inaczej.

Oczywiście istnieje również $geoNear operatora dla potoku agregacji. Jest to dostępne od MongoDB 2.4 i może wykorzystywać inne opcje, takie jak „zapytanie”, aby zawęzić wyniki. Inną możliwą zaletą jest to, że „wyrzuci” na wyniki pole reprezentujące „odległość” od punktu zapytania. Można to wykorzystać w innych obliczeniach lub sortowaniu niestandardowym:

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
    }
);

Inne różnice, na które należy zwrócić uwagę, to fakt, że w standardowym formularzu zapytania wyniki nie są już ograniczone do 100 dokumentów, ponieważ są one w formularzu „polecenia”. Agregacja $geoNear domyślnie ogranicza do 100 dokumentów jako wyniki, ale liczbę zwracanych dokumentów można dostosować za pomocą dodatkowej opcji „limit” w poleceniu potoku. Zestawienie zbiorcze nie „sortuje” wyników innych niż z maksymalnej liczby dokumentów do zwrócenia z wyszukiwania, które są najlepszymi wynikami, biorąc pod uwagę warunki, ale nie są one zwracane w kolejności, więc musisz je posortować tak, jak pokazano.

W obu przypadkach powinieneś przenieść swój kod, aby używać jednego z tych formularzy, ponieważ formularz polecenia jest uważany za przestarzały i zostanie usunięty w przyszłości. Nie wiadomo, czy interfejs API mongoose zachowuje swoją metodę jako „opakowanie” dla jednej z tych form, ale jest to mało prawdopodobne, więc lepiej trzymać się obsługiwanych form.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Morphia MongoDB sprawdza, czy nie ma pola zerowego i nieistniejącego

  2. Połącz się domyślnie z określoną bazą danych w mongodb

  3. Zapytanie o podpole w documentdb

  4. Parse.com dodaje obiekt JSON do tablicy JSON

  5. Operator Near dla punktu geojson zwracającego błąd, gdy w zapytaniu użyto maxdistance