Geografische Abfragen verwenden

Verwenden Sie raumbezogene Abfragen in MongoDB-kompatiblen Vorgängen, um Dokumente abzufragen, die sich in einem bestimmten Bereich von einem bestimmten Längen- und Breitengrad befinden.

Hinweis

  1. Sie benötigen Zugriff auf eine vorhandene MongoDB-kompatible Datenbank für Vorgänge oder müssen eine Datenbank erstellen und eine Verbindung zu ihr herstellen.

  2. Sie müssen mindestens einen 2dsphere-Index haben oder einen 2dsphere-Index erstellen.

GeoJSON-Objekte

Wenn Sie eine Geodatenabfrage für Felder in Ihrer Sammlung ausführen möchten, müssen die Felder, die Sie abfragen, GeoJSON-Objekte oder GeoPoints sein.

Mit dem Operator $near können Sie eine raumbezogene Abfrage ausführen, bei der die Entfernung eines geografischen Punkts relativ zu geografischen Punkten in Dokumenten berechnet wird. Diese Dokumente werden dann in den Suchergebnissen nach Entfernung sortiert, von der geringsten bis zur größten. 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 die Entfernung 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, von der geringsten zur größten.

  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 Anfrage zu steuern. Im folgenden Beispiel sehen Sie eine Abfrage, 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 „and“ in Ihre Abfrage einfügen. Wenn Sie beispielsweise eine region-Partition haben und die Ergebnisse Ihrer Abfrage nach der Region midwest filtern möchten, können Sie Folgendes tun:

  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

  • $near- und $text-Operatoren können nicht in derselben Abfrage verwendet werden.
  • $near kann nicht in einer $or-Anweisung mit mehreren Klauseln verschachtelt werden, es sei denn, $near ist der einzige Ausdruck in der $or-Klausel.
  • $near kann in einer Abfrage nicht mit den Operatoren $not oder $nor verwendet werden.
  • $near wird in Aggregationsabfragen nicht unterstützt.