Mit raumbezogenen Abfragen in MongoDB-kompatiblen Vorgängen können Sie Dokumente abfragen, die sich in einem bestimmten Bereich von einem bestimmten Längen- und Breitengrad befinden.
Hinweis
Prüfen Sie, ob mindestens ein 2dsphere-Index vorhanden ist, oder erstellen Sie einen 2dsphere-Index.
GeoJSON-Objekte
Wenn Sie eine raumbezogene Abfrage für Felder in Ihrer Sammlung ausführen möchten, müssen die abgefragten Felder GeoJSON-Objekte oder GeoPointssein.
Raumbezogene Abfrage ausführen
Sie können eine raumbezogene Abfrage mit dem Operator $near ausführen, der den Abstand eines geografischen Punkts zu geografischen Punkten in Dokumenten berechnet. Diese Dokumente werden dann in den Abfrageergebnissen nach Entfernung sortiert, von der kürzesten bis zur größten Entfernung. Sie können diese Sortierreihenfolge auch überschreiben, indem Sie in Ihrer Abfrage eine sekundäre Sortierung definieren, die nicht $natural ist. Der Operator $near muss in einem Dokumentfeld im Abfragefilter vorhanden sein und ein $geometry-GeoJSON-Feld enthalten.
Im folgenden Beispiel wird der Operator $near verwendet, um den Abstand
zwischen dem geografischen Punkt (-122.084, 37.4221) und den geografischen Punkten im Feld
location aller Dokumente in myCollection. zu berechnen. Die Dokumente werden zurückgegeben
und nach der Entfernung zwischen den beiden Punkten sortiert.
db.myCollection.find({
location: {
$near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
}
}
}
}
)
Sie können auch die optionalen Felder $maxDistance und $minDistance verwenden, um die Entfernung in Metern vom Punkt Ihrer Abfrage zu steuern.
Im folgenden Beispiel wird eine Abfrage gezeigt, bei der zurückgegebene Dokumente mindestens 500 Meter und höchstens 2.000 Meter vom Punkt (-122.084, 37.4221) entfernt sein müssen:
db.myCollection.find({
location: {
$near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
},
$maxDistance: 2000,
$minDistance: 500
}
}
}
Wenn Ihr Index partitioniert ist, können Sie nach der Partition filtern, indem Sie die Partition in einen Gleichheitsfilter mit „und“ in Ihre Abfrage einbeziehen.
Wenn Sie beispielsweise eine region-Partition haben und Ihre Abfrageergebnisse nach der Region midwest filtern möchten, können Sie so vorgehen:
db.myCollection.find( { $and: [
{ location:
{ $near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
},
}
},
{ "region": "midwest" }
] } )
Der Wert Ihrer Partition muss ein String sein. Ihr Partitionsfilter muss mit dem Operator $and mit Ihrer Suchanfrage verknüpft werden.
Beschränkungen
- Die Operatoren
$nearund$textkönnen nicht in derselben Abfrage verwendet werden. $nearkann nicht in einer$or-Anweisung mit mehreren Klauseln verschachtelt werden, es sei denn,$nearist der einzige Ausdruck in der$or-Klausel.$nearkann in einer Abfrage nicht mit den Operatoren$notoder$norverwendet werden.$nearwird in Aggregationsabfragen nicht unterstützt.