Menanyakan data geospasial dengan Amazon DocumentDB - Amazon DocumentDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menanyakan data geospasial dengan Amazon DocumentDB

Bagian ini mencakup bagaimana Anda dapat menanyakan data Geospasial dengan Amazon DocumentDB. Setelah Anda membaca bagian ini, Anda akan dapat menjawab bagaimana menyimpan, menanyakan, dan mengindeks data Geospasial di Amazon DocumentDB.

Gambaran Umum

Kasus penggunaan umum untuk Geospasial melibatkan analisis kedekatan dari data Anda. Misalnya, “menemukan semua bandara dalam jarak 50 mil dari Seattle”, atau “temukan restoran terdekat dari lokasi tertentu”. Amazon DocumentDB menggunakan spesifikasi GeoJSON untuk mewakili data geospasial. GeoJSON adalah spesifikasi open-source untuk format JSON bentuk dalam ruang koordinat. Koordinat GeoJSON menangkap bujur dan lintang, mewakili posisi pada bola mirip bumi.

Mengindeks dan menyimpan data geospasial

Amazon DocumentDB menggunakan tipe GeoJSON 'Point' untuk menyimpan data geospasial. Setiap dokumen GeoJSON (atau subdokumen) umumnya terdiri dari dua bidang:

  • type - bentuk yang diwakili, yang menginformasikan Amazon DocumentDB bagaimana menafsirkan bidang “koordinat”. Saat ini, Amazon DocumentDB hanya mendukung poin

  • koordinat — pasangan lintang dan bujur direpresentasikan sebagai objek dalam array — [bujur, lintang]

Amazon DocumentDB juga menggunakan indeks 2dsphere untuk mengindeks data Geospasial. Amazon DocumentDB mendukung poin pengindeksan. Amazon DocumentDB mendukung query proximity dengan pengindeksan 2dsphere.

Mari pertimbangkan skenario di mana Anda sedang membangun aplikasi untuk layanan pengiriman makanan. Anda ingin menyimpan berbagai lintang dan pasangan bujur restoran di Amazon DocumentDB. Untuk melakukannya, pertama-tama kami sarankan Anda membuat indeks pada bidang Geospasial yang memegang pasangan lintang dan bujur.

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

Output dari perintah ini akan terlihat seperti ini:

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

Setelah Anda membuat indeks, Anda dapat mulai memasukkan data ke dalam koleksi Amazon DocumentDB Anda.

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 ] } });

Meminta data geospasial

Amazon DocumentDB mendukung kueri kedekatan, inklusi, dan persimpangan data Geospasial. Contoh yang baik dari kueri kedekatan adalah menemukan semua titik (semua bandara) yang kurang dari jarak tertentu dan lebih dari jarak dari titik lain (kota). Contoh yang baik dari kueri inklusi adalah menemukan semua titik (semua bandara) yang terletak di area/poligon tertentu (negara bagian New York). Contoh yang baik dari kueri persimpangan adalah menemukan poligon (status) yang berpotongan dengan titik (kota). Anda dapat menggunakan operator Geospasial berikut untuk mendapatkan wawasan dari data Anda.

  • $nearSphere- $nearSphere adalah operator find yang mendukung pencarian titik dari terdekat ke terjauh dari titik GeoJSON.

  • $geoNear- $geoNear adalah operator agregasi yang mendukung penghitungan jarak dalam meter dari titik GeoJSON.

  • $minDistance- $minDistance adalah operator find yang digunakan bersama dengan $nearSphere atau $geoNear untuk memfilter dokumen yang setidaknya pada jarak minimum yang ditentukan dari titik pusat.

  • $maxDistance- $maxDistance adalah operator find yang digunakan bersama dengan $nearSphere atau $geoNear untuk memfilter dokumen yang paling banyak pada jarak maksimum yang ditentukan dari titik pusat.

  • $geoWithin- $geoWithin adalah operator find yang mendukung pencarian dokumen dengan data geospasial yang ada seluruhnya dalam bentuk tertentu seperti poligon.

  • $geoIntersects- $geoIntersects adalah operator find yang mendukung pencarian dokumen yang data geospasialnya berpotongan dengan objek GeoJSON tertentu.

catatan

$geoNeardan $nearSphere memerlukan indeks 2dsphere pada bidang GeoJSON yang Anda gunakan dalam kueri kedekatan Anda.

Contoh 1

Dalam contoh ini, Anda akan belajar bagaimana menemukan semua restoran (titik) yang diurutkan berdasarkan jarak terdekat dari alamat (titik).

Untuk melakukan kueri seperti itu, Anda dapat menggunakan $geoNear untuk menghitung jarak set titik dari titik lain. Anda juga dapat menambahkan distanceMultiplier untuk mengukur jarak dalam kilometer.

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

Perintah di atas akan mengembalikan restoran yang diurutkan berdasarkan jarak (paling dekat dengan terjauh) dari titik yang ditentukan. Output dari perintah ini akan terlihat seperti ini

{ "_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 }

Untuk membatasi jumlah hasil dalam kueri, gunakan num opsi limit or.

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 } } ])
catatan

$geoNeartahap mendukung limit dan num pilihan untuk menentukan jumlah maksimum dokumen untuk kembali. $geoNearmengembalikan maksimal 100 dokumen secara default jika num opsi limit atau tidak ditentukan. Ini diganti dengan nilai $limit tahap jika ada dan nilainya kurang dari 100.

Contoh 2

Dalam contoh ini, Anda akan belajar cara menemukan semua restoran (poin) dalam jarak 2 kilometer dari alamat (titik) tertentu. Untuk melakukan kueri seperti itu, Anda dapat menggunakan $nearSphere dalam minimum $minDistance dan maksimum $maxDistance dari GeoJSON Point

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

Perintah di atas akan mengembalikan restoran pada jarak maksimum 2 kilometer dari titik yang ditentukan. Output dari perintah ini akan terlihat seperti ini

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

Batasan

Amazon DocumentDB tidak mendukung kueri atau pengindeksan LineString Poligon,,,,, dan. MultiPoint MultiPolygon MultiLineString GeometryCollection