Używaj zapytań geoprzestrzennych w operacjach zgodnych z MongoDB, aby wysyłać zapytania o dokumenty, które znajdują się w określonym zakresie od określonej długości i szerokości geograficznej.
Zanim zaczniesz
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ą.
Upewnij się, że 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.
Uruchamianie zapytania geoprzestrzennego
Zapytanie geoprzestrzenne możesz wykonać za pomocą operatora $near, który oblicza odległość punktu geograficznego względem punktów geograficznych w dokumentach. Te dokumenty są następnie sortowane w wynikach zapytania od najbliższej do najdalszej odległości. Możesz też zastąpić tę kolejność sortowania, definiując w zapytaniu sortowanie dodatkowe inne niż $natural. Operator $near musi znajdować się w polu dokumentu w filtrze zapytania i musi zawierać pole GeoJSON $geometry.
W tym 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 porządkowane według odległości między tymi 2 punktami, od najmniejszej do największej.
db.myCollection.find({
location: {
$near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
}
}
}
}
)
Możesz też użyć opcjonalnych pól $maxDistance i $minDistance, aby kontrolować 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 metrów i co najwyżej 2000 metrów 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ć według partycji, uwzględniając partycję w filtrze równości „and” w zapytaniu.
Jeśli na przykład masz partycję region i chcesz przefiltrować 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
- W tym samym zapytaniu nie można używać operatorów
$neari$text. - Funkcji
$nearnie można umieszczać w instrukcji$orz wieloma klauzulami, chyba że$nearjest jedynym wyrażeniem w klauzuli$or. - W zapytaniu nie można używać operatora
$nearz operatorami$notani$nor. - Funkcja
$nearnie jest obsługiwana w zapytaniach agregujących.