Użyj 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
Sprawdź, czy masz dostęp do istniejącej bazy danych operacji zgodnych z MongoDB , lub utwórz bazę danych i połącz się z nią.
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 GeoPoint.
Uruchamianie zapytania geoprzestrzennego
Zapytanie geoprzestrzenne możesz wykonać za pomocą operatora $near, który oblicza odległość punktu geograficznego od punktów geograficznych w dokumentach. Dokumenty te są następnie sortowane w wynikach zapytania według odległości od najbliższej do najdalszej. 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 $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 uporządkowane według odległości między tymi 2 punktami (od najbliższej do najdalszej).
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 zwracane 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ć na podstawie partycji, uwzględniając ją w filtrze równości „and” w zapytaniu.
Jeśli na przykład masz partycję region i chcesz filtrować wyniki zapytania według regionu midwest, możesz to zrobić w ten sposób:
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 wyszukiwania za pomocą operatora $and.
Ograniczenia
- W tym samym zapytaniu nie można używać operatorów
$neari$text. - Operatora
$nearnie można zagnieżdżać w instrukcji$orz wieloma klauzulami, chyba że$nearjest jedynym wyrażeniem w klauzuli$or. - Operatora
$nearnie można używać w zapytaniu z operatorami$notani$nor. - Operator
$nearnie jest obsługiwany w zapytaniach agregacji.