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

Znajdź lokalizację w zapisanym kręgu

Jeszcze bardziej optymalny niż oryginał, możesz teraz użyć $expr w ramach $match etap po początkowym $geoNear :

db.collection.aggregate([
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ 23.027573, 72.50675800000001 ],
        },
        "distanceField": "distance"
    }},
    { "$match": { "$expr": { "$lte": [ "$distance", "$radius" ] } }}
])

Właściwie trochę bardziej optymalna niż przy pierwszym napisaniu. Teraz możemy po prostu $redact zamiast $project wartość logiczna i $match później:

db.collection.aggregate([
    // Match documents "near" the queried point
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ 23.027573, 72.50675800000001 ],
        },
        "distanceField": "distance"
    }},

    // Calculate if distance is within radius and remove if not
    { "$redact": {
        "$cond": {
            "if": { "$lte": [ "$distance", "$radius" ] },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}
])

Informacje zostały zapisane dokładnie tak, jak powinny, ale istnieje inne podejście do uzyskiwania wyników niż myślisz.

To, czego chcesz użyć, to $geoNear a konkretnie struktura agregacji formy tego operatora. Oto, co robisz:

db.collection.aggregate([
    // Match documents "near" the queried point
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ 23.027573, 72.50675800000001 ],
        },
        "distanceField": "distance"
    }},

    // Calculate if distance is within radius
    { "$project": {
        "location": 1,
        "radius": 1,
        "distance": 1,
        "within": { "$lte": [ "$distance", "$radius" ] }
    }},

    // Match only documents within the radius
    { "$match": { "within": true } }
])

Tak więc ta forma pozwala na "odwzorowanie" odległości od badanego punktu w wynikach, podczas gdy zapytanie zwróci tylko najbliższe dokumenty.

Następnie używasz logicznego porównania, aby sprawdzić, czy wartość „odległość” jest mniejsza niż „promień”, a więc w obrębie okręgu.

Na koniec dopasowujesz, aby odfiltrować tylko te wyniki, w których stwierdzenie „wewnątrz” było prawdziwe.

Możesz dodać inne opcje do $geoNear jak pokazano w dokumentacji. Gorąco sugerowałbym również, aby twoje przechowywanie również używało formatu GeoJSON, ponieważ prawdopodobnie będzie on bardziej kompatybilny z innymi bibliotekami, których możesz użyć do pracy z uzyskanymi wynikami.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose:Jak zapełnić populację o głębokości 2 poziomu bez wypełniania pól pierwszego poziomu? w mongodb

  2. Nie można usunąć z kolekcji mongodb angular MEAN stack

  3. Jak automatycznie ponownie podłączyć mongo na serwerze node.js?

  4. Wybierz ostatnią wartość tablicy w poddokumencie

  5. Błąd krytyczny — nie znaleziono klasy „Mongo”