Dieses Kapitel führt in die geospatiale Abfrage von MongoDB ein, die geometrische Schnitt- und Enthaltsamkeitsabfragen unterstützt.

Anwendungsszenarien:

  • Zeichnen Sie einen Kreis auf der Karte und fragen Sie die Daten innerhalb des Kreises ab.

Voraussetzungstutorial

Geospatiale Datenspeicherformate für MongoDB

Die Voraussetzungen für die Abfrage von Daten basierend auf der Entfernung sind wie folgt:

  • Jedes Dokument enthält ein Feld zur Speicherung von Koordinatendaten, z. B. speichert das Feld "Standort" die Koordinaten eines Geschäfts.
  • Erstellen Sie einen 2dsphere- oder 2d-spatialen Index.

$geoWithin Operator

Dieser wird häufig verwendet, um Koordinatenpunkte innerhalb eines bestimmten geometrischen Bereichs abzufragen, z. B. beim Suchen von Häusern durch Zeichnen auf einer Karte, zeichnen Sie einen Bereich auf der Karte und fragen Sie die Häuser innerhalb dieses Bereichs ab.

Syntaxformat:

{
   <Standortfeld>: { // Abfragefeld
      $geoWithin: {
         $geometry: {
            type:  , // Unterstützt nur Polygon oder MultiPolygon.
            coordinates: [ <Koordinaten> ]  // Sammlung geometrischer Koordinatenpunkte
         }
      }
   }
}

Beispiel:

db.places.find(
   {
     loc: { // Das Feld 'loc' speichert die Koordinatendaten
       $geoWithin: {
          $geometry: {
             type: "Polygon" ,
             coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] // Finde Daten innerhalb dieses geometrischen Bereichs
          }
       }
     }
   }
)

Abfrage von Dokumentendaten innerhalb des spezifizierten geometrischen Bereichs in der Sammlung "places".

$geoIntersects Operator

Der Unterschied zu $geoWithin besteht darin, dass $geoIntersects verwendet wird, um festzustellen, ob es eine Schnittstelle zwischen zwei Geometrien gibt.

Format:

{
  <Standortfeld>: { // Feld zur Speicherung geometrischer Koordinatenpunkte
     $geoIntersects: {
        $geometry: {
           type: "<GeoJSON-Objekttyp>" , // Geometrischer Typ
           coordinates: [ <Koordinaten> ] // Sammlung geometrischer Koordinatenpunkte, Abfrage von Daten mit Schnittstelle zu dieser Geometrie
        }
     }
  }
}

Beispiel:

db.places.find(
   {
     loc: { // Das Feld 'loc' speichert Bereichsdaten, die eine geometrische Form darstellen
       $geoIntersects: {
          $geometry: {
             type: "Polygon" ,
             coordinates: [
               [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] // Abfrage von Daten mit Schnittstelle zu dieser Geometrie
             ]
          }
       }
     }
   }
)