Korzystanie z wyszukiwania geoprzestrzennego

Używaj zapytań geoprzestrzennych w operacjach zgodnych z MongoDB, aby wyszukiwać dokumenty znajdujące się w określonym zakresie od konkretnej długości i szerokości geograficznej.

Zanim zaczniesz

  1. Upewnij się, że masz dostęp do istniejącej bazy danych operacji zgodnej z MongoDB lub utwórz bazę danych i połącz się z nią.

  2. Sprawdź, czy masz co najmniej 1 indeks 2dsphere, lub utwórz indeks 2dsphere.

Obiekty GeoJSON

Aby uruchomić zapytanie geoprzestrzenne dotyczące pól w kolekcji, pola, których dotyczy zapytanie, muszą być obiektami GeoJSON lub punktami geograficznymi.

Zapytanie geoprzestrzenne możesz wykonać za pomocą operatora $near, który oblicza odległość punktu geograficznego od punktów geograficznych w dokumentach. Dokumenty są następnie sortowane w wynikach zapytania od najbliższego do najdalszego. Możesz też zastąpić tę kolejność sortowania, definiując w zapytaniu sortowanie dodatkowe inne niż $natural. Operator $near musi występować w polu dokumentu w filtrze zapytania i musi zawierać pole $geometry GeoJSON.

W poniższym przykładzie operator $near służy do obliczania odległości między punktem geograficznym (-122.084, 37.4221) a punktami geograficznymi znajdującymi się w polu location wszystkich dokumentów w myCollection.. Dokumenty są zwracane i sortowane według odległości między dwoma punktami – od najbliższego do najdalszego.

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        }
      }
    }
  }
  )

Możesz też użyć opcjonalnych pól $maxDistance$minDistance, aby określić odległość w metrach od punktu zapytania. Poniższy przykład pokazuje zapytanie, w którym zwrócone dokumenty muszą znajdować się w odległości co najmniej 500 m i co najwyżej 2000 m od punktu (-122.084, 37.4221):

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
        $maxDistance: 2000,
        $minDistance: 500
      }
    }
  }

Jeśli indeks jest podzielony na partycje, możesz filtrować na podstawie partycji, uwzględniając ją w zapytaniu w filtrze równości „and”. Jeśli na przykład masz partycję region i chcesz filtrować wyniki zapytania według regionu midwest, możesz wykonać te czynności:

  db.myCollection.find( { $and: [
    { location:
      { $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
      }
    },
    { "region": "midwest" }
  ] } )

Wartość partycji musi być ciągiem znaków. Filtr partycji musi być połączony z zapytaniem za pomocą operatora $and.

Ograniczenia

  • Operatorów $near$text nie można używać w tym samym zapytaniu.
  • Funkcji $near nie można zagnieżdżać w instrukcji $or z wieloma klauzulami, chyba że $near jest jedynym wyrażeniem w klauzuli $or.
  • W zapytaniu nie można używać operatora $near z operatorami $not ani $nor.
  • $near nie jest obsługiwany w przypadku zapytań o agregację.