Geospatiale Suche verwenden

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

  1. Prüfen Sie, ob Sie Zugriff auf eine vorhandene MongoDB-kompatible Vorgangsdatenbank haben, oder erstellen Sie eine Datenbank und stellen Sie eine Verbindung zu ihr her.

  2. 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.

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 $near und $text 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.