Raumbezogene Abfragen verwenden

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

Hinweis

  1. Prüfen Sie, ob Sie Zugriff auf eine vorhandene MongoDB-kompatible Betriebsdatenbank 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 Geodatenabfrage für Felder in Ihrer Sammlung ausführen möchten, müssen die abgefragten Felder GeoJSON-Objekte oder GeoPoints sein.

Sie können eine raumbezogene Abfrage mit dem Operator $near ausführen, der die Entfernung eines Geopunkts relativ zu Geopunkten in Dokumenten berechnet. Diese Dokumente werden dann in den Abfrageergebnissen von der geringsten bis zur größten Entfernung sortiert. 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 GeoJSON-Feld $geometry enthalten.

Im folgenden Beispiel wird der Operator $near verwendet, um die Entfernung zwischen dem Geopunkt (-122.084, 37.4221) und den Geopunkten 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 kürzesten bis zur längsten Entfernung.

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        }
      }
    }
  }
  )

Mit den optionalen Feldern $maxDistance und $minDistance können Sie auch die Entfernung in Metern vom Punkt Ihrer Abfrage steuern. Das folgende Beispiel zeigt eine Abfrage, bei der die zurückgegebenen 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 „and“-Gleichheitsfilter in Ihrer Abfrage einfügen. 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 der Partition muss ein String sein. Der Partitionsfilter muss mit einem $and-Operator mit der 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.