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.
Themen
-Ü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
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—$nearSphereist ein Suchoperator, der das Auffinden von Punkten unterstützt, die einem GeoJSON-Punkt am nächsten zum nächsten am weitesten entfernt sind. -
$geoNear—$geoNearist ein Aggregationsoperator, der die Berechnung der Entfernung von einem GeoJSON-Punkt in Metern unterstützt. -
$minDistance-$minDistanceist ein Suchoperator, der in Verbindung mit$nearSphereoder$geoNearzum Filtern von Dokumenten verwendet wird, die mindestens den angegebenen Mindestabstand vom Mittelpunkt haben. -
$maxDistance—$maxDistanceist ein Suchoperator, der in Verbindung mit$nearSphereoder$geoNearzum Filtern von Dokumenten verwendet wird, die sich höchstens in der angegebenen maximalen Entfernung vom Mittelpunkt befinden. -
$geoWithin—$geoWithinist 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-$geoIntersectsist 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