View a markdown version of this page

Abfragen von Geodaten mit Amazon DocumentDB - Amazon DocumentDB

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Abfragen von Geodaten mit Amazon DocumentDB

In diesem Abschnitt wird beschrieben, wie Sie Geodaten mit Amazon DocumentDB abfragen können. Nachdem Sie diesen Abschnitt gelesen haben, können Sie beantworten, wie Geodaten in Amazon DocumentDB gespeichert, abgefragt und indexiert werden.

-Übersicht

Zu den häufigsten Anwendungsfällen für Geospatial gehört die Näherungsanalyse Ihrer Daten. Zum Beispiel „alle Flughäfen im Umkreis von 50 Meilen von Seattle finden“ oder „Finden Sie die nächstgelegenen Restaurants von einem bestimmten Standort aus“. Amazon DocumentDB verwendet die GeoJSON-Spezifikation zur Darstellung von Geodaten. GeoJSON ist eine Open-Source-Spezifikation für die Darstellung JSON-formatting von Formen in einem Koordinatenraum. GeoJSON-Koordinaten erfassen sowohl den Längen- als auch den Breitengrad und stellen Positionen auf einer erdähnlichen Kugel dar.

Indizierung und Speicherung von Geodaten

Amazon DocumentDB verwendet den GeoJSON-Typ „Point“ zum Speichern von Geodaten. Jedes GeoJSON-Dokument (oder Unterdokument) besteht im Allgemeinen aus zwei Feldern:

  • type — die dargestellte Form, die Amazon DocumentDB darüber informiert, wie das Feld „Koordinaten“ zu interpretieren ist. Derzeit unterstützt Amazon DocumentDB nur Punkte

  • Koordinaten — ein Breiten- und Längengradpaar, das als Objekt in einem Array dargestellt wird — [Längengrad, Breitengrad]

Amazon DocumentDB verwendet auch 2dSphere-Indizes, um Geodaten zu indizieren. Amazon DocumentDB unterstützt Indexierungspunkte. Amazon DocumentDB unterstützt Proximity-Abfragen mit 2dsphere-Indizierung.

Stellen wir uns ein Szenario vor, in dem Sie eine Anwendung für den Lieferservice von Lebensmitteln erstellen. Sie möchten Breiten- und Längengradpaare für Restaurants in Amazon DocumentDB speichern. Erstellen Sie dazu zunächst einen Index für das Geodatenfeld, das das Breiten- und Längengradpaar enthält.

use restaurantsdb db.usarestaurants.createIndex({location:"2dsphere"})

Die Ausgabe dieses Befehls würde ungefähr so aussehen:

{ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }

Sobald Sie einen Index erstellt haben, können Sie mit dem Einfügen von Daten in Ihre Amazon DocumentDB-Sammlung beginnen.

db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Thai Palace", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -122.3264, 47.6009 ] } }); db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Noodle House", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -122.3517, 47.6159 ] } }); db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Curry House", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -121.4517, 47.6229 ] } });

Abfragen von koordinatenbasierten Daten

Amazon DocumentDB unterstützt Näherungs-, Inklusions- und Schnittpunktabfragen von Geodaten. Ein gutes Beispiel für eine Näherungsabfrage ist die Suche nach allen Punkten (allen Flughäfen), die weniger als eine bestimmte Entfernung und mehr als eine Entfernung von einem anderen Punkt (Stadt) entfernt sind. Ein gutes Beispiel für eine Inklusionsabfrage ist die Suche nach allen Punkten (allen Flughäfen), die sich in einem bestimmten Gebiet area/polygon (Bundesstaat New York) befinden. Ein gutes Beispiel für eine Kreuzungsabfrage ist die Suche nach einem Polygon (Bundesstaat), das sich mit einem Punkt (Stadt) überschneidet. Sie können die folgenden Geodatenoperatoren verwenden, um Erkenntnisse aus Ihren Daten zu gewinnen.

  • $nearSphere$nearSphere ist ein Suchoperator, der das Auffinden von Punkten unterstützt, die einem GeoJSON-Punkt am nächsten zum nächsten am weitesten entfernt sind.

  • $geoNear$geoNear ist ein Aggregationsoperator, der die Berechnung der Entfernung von einem GeoJSON-Punkt in Metern unterstützt.

  • $minDistance- $minDistance ist ein Suchoperator, der in Verbindung mit $nearSphere oder $geoNear zum Filtern von Dokumenten verwendet wird, die mindestens den angegebenen Mindestabstand vom Mittelpunkt haben.

  • $maxDistance$maxDistance ist ein Suchoperator, der in Verbindung mit $nearSphere oder $geoNear zum Filtern von Dokumenten verwendet wird, die sich höchstens in der angegebenen maximalen Entfernung vom Mittelpunkt befinden.

  • $geoWithin$geoWithin ist ein Suchoperator, der die Suche nach Dokumenten mit Geodaten unterstützt, die sich vollständig innerhalb einer bestimmten Form, z. B. eines Polygons, befinden.

  • $geoIntersects- $geoIntersects ist ein Suchoperator, der die Suche nach Dokumenten unterstützt, deren Geodaten sich mit einem bestimmten GeoJSON-Objekt überschneiden.

Anmerkung

$geoNearund $nearSphere benötigen einen 2dSphere-Index für das GeoJSON-Feld, das Sie in Ihrer Näherungsabfrage verwenden.

Beispiel 1

In diesem Beispiel erfahren Sie, wie Sie alle Restaurants (Punkte) finden, sortiert nach der nächstgelegenen Entfernung zu einer Adresse (Punkt).

Um eine solche Abfrage durchzuführen, können Sie $geoNear die Entfernung einer Reihe von Punkten von einem anderen Punkt berechnen. Sie können das auch hinzufügendistanceMultiplier, um die Entfernung in Kilometern zu messen.

db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001 } } ])

Mit dem obigen Befehl würden Restaurants nach Entfernung (am nächsten bis am weitesten) vom angegebenen Punkt sortiert zurückgegeben. Die Ausgabe dieses Befehls würde ungefähr so aussehen

{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "state" : "Washington", "city" : "Seattle", "name" : "Noodle House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3517, 47.6159 ] }, "DistanceKilometers" : 0.03422834547294996 } { "_id" : ObjectId("611f3da185009a81ad38e74a"), "state" : "Washington", "city" : "Seattle", "name" : "Thai Palace", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3264, 47.6009 ] }, "DistanceKilometers" : 2.5009390081704277 } { "_id" : ObjectId("611f3dae85009a81ad38e74c"), "state" : "Washington", "city" : "Seattle", "name" : "Curry House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -121.4517, 47.6229 ] }, "DistanceKilometers" : 67.52845344856914 }
Anmerkung

Die num Optionen limit und für die $geoNear Phase sowie die Standardbeschränkung von 100 Dokumenten sind in Amazon DocumentDB 8.0 (Engine-Patch Version 4.0.5748) und höher veraltet. Die folgenden Beispiele verwenden Amazon DocumentDB 8.0 (Engine-Patch Version 4.0.4448) limit und frühere Versionen und num gelten nur für diese.

Verwenden Sie die Option oder, um die Anzahl der Ergebnisse einer Abfrage zu begrenzen. limit num

limit:

db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001, "limit": 10 } } ])

num:

db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001, "num": 10 } } ])

Beispiel 2

In diesem Beispiel erfahren Sie, wie Sie alle Restaurants (Punkte) im Umkreis von 2 Kilometern von einer bestimmten Adresse (Punkt) finden. Um eine solche Abfrage durchzuführen, können Sie $nearSphere innerhalb eines Mindest $minDistance - und Höchstwerts $maxDistance von einem GeoJSON-Punkt aus verwenden

db.usarestaurants.find({ "location":{ "$nearSphere":{ "$geometry":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "$minDistance":1, "$maxDistance":2000 } } }, { "name":1 })

Mit dem obigen Befehl würden Restaurants zurückgegeben, die sich in einer maximalen Entfernung von 2 Kilometern vom angegebenen Punkt befinden. Die Ausgabe dieses Befehls würde ungefähr so aussehen

{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "name" : "Noodle House" }

Einschränkungen

Amazon DocumentDB unterstützt weder die Abfrage noch die Indizierung von Polygonen,, LineString, MultiPoint und. MultiPolygon MultiLineString GeometryCollection