Cara menggunakan mongodb geospatial query performance

Hey sob, pada tutorial kali ini saya ingin membahas geospasial query menggunakan database mongodb. Apa itu geospasial query sederhananya itu digunakan untuk mengukur jarak menggunakan latitude dan longitude dari 2 titik. Tujuannya dapat mengukur atau mencari tempat terdekat dengan radius tertentu.

Kemudian pertanyaannya kenapa mongodb? Oke saya jelaskan alasan kenapa saya pilih awalnya karena saya familiar dengan mongodb hehehe.. dan karena di mongodb ada beberapa index geospasial yang bisa kita gunakan tanpa harus kita buat perhitungan yang rumit. Di mongodb ada yang namanya index 2dsphere.

{

loc : { type: "Point", coordinates: [ yourlongitude, yourlatitude ] }

}

Oke langsung saja kita coba.

Pertama saya asumsikan kita sudah punya sebuat projek laravel. masuk ke root direktory laravel kemudian kita install library dari https://github.com/jenssegers/laravel-mongodb

Pertama-tama buat dulu model seperti ini.

Selanjutnya simpan data beserta dengan latitude dan longitude dengan format seperti yang sudah saya sampaikan di atas.

TextSearchModel::raw()->createIndex([‘loc’ => ‘2dsphere’]);

Kode diatas digunakan untuk membuat index 2dsphere, jangan lupa menambahkan kode tersebut setelah insert data lokasi anda.

Selanjutnya jika sudah berhasil disimpan maka untuk mendapatkan lokasi terdekat. Maka kodenya seperti ini.

TextSearchModel::where(‘loc’, ‘near’, [ ‘$geometry’ => [‘type’ => ‘Point’,’coordinates’ => [(float)$longitude,(float)$latitude]], ‘$maxDistance’ => (float)env(“PLACE_SEARCH_RADIUS”,150000)])

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

Bagian ini mencakup bagaimana Anda dapat melakukan kueri data Geospasial dengan Amazon DocumentDB. Setelah Anda membaca bagian ini, Anda akan dapat menjawab bagaimana menyimpan, query dan indeks 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 menggunakanSpesifikasi GeoJSONuntuk mewakili data geospasial. GeoJSON adalah spesifikasi open-source untuk JSON-format bentuk dalam ruang koordinat. Koordinat GeoJSON menangkap bujur dan garis lintang, mewakili posisi pada bola seperti 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:

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

  • mengoordinasikan- pasangan lintang dan bujur direpresentasikan sebagai objek dalam array - [bujur, lintang]

Amazon DocumentDB juga menggunakan indeks 2dsphere untuk mengindeks data Geospasial. Amazon DocumentDB mendukung titik pengindeksan. Amazon DocumentDB mendukung kueri kedekatan dengan pengindeksan 2dsphere.

Mari pertimbangkan skenario di mana Anda sedang membangun aplikasi untuk layanan pengiriman makanan. Anda ingin menyimpan berbagai garis lintang restoran dan pasangan bujur 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 berikut ini:

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

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

Mengkueri Data Geospasial

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

  • $nearSphere-$nearSphereadalah operator find yang mendukung menemukan titik dari terdekat ke terjauh dari titik GeoJSON.

  • $geoNear-

    {
    	"createdCollectionAutomatically" : true,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }
    0adalah operator agregasi yang mendukung penghitungan jarak dalam meter dari titik GeoJSON.

  • {
    	"createdCollectionAutomatically" : true,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }
    1-
    {
    	"createdCollectionAutomatically" : true,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }
    2adalah operator find yang digunakan bersama dengan$nearSphereatau
    {
    	"createdCollectionAutomatically" : true,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }
    0untuk menyaring dokumen yang setidaknya pada jarak minimum yang ditentukan dari titik tengah.

  • {
    	"createdCollectionAutomatically" : true,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }
    5-
    {
    	"createdCollectionAutomatically" : true,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }
    6adalah operator find yang digunakan bersama dengan$nearSphereatau
    {
    	"createdCollectionAutomatically" : true,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }
    0untuk menyaring dokumen yang paling banyak berada pada jarak maksimum yang ditentukan dari titik tengah.

  • {
    	"createdCollectionAutomatically" : true,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }
    9-
    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
          ]
       }
    });
    0adalah operator find yang mendukung pencarian dokumen dengan data geospasial yang ada seluruhnya dalam bentuk tertentu seperti poligon.

  • 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
          ]
       }
    });
    1-
    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
          ]
       }
    });
    2adalah operator find yang mendukung pencarian dokumen yang data geospasialnya berpotongan dengan objek GeoJSON tertentu.

{
	"createdCollectionAutomatically" : true,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}
0dan$nearSpherememerlukan indeks 2dsphere pada bidang GeoJSON yang Anda gunakan dalam kueri kedekatan Anda.

Contoh 1

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

Untuk melakukan kueri seperti itu, Anda dapat menggunakan

{
	"createdCollectionAutomatically" : true,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}
0untuk menghitung jarak set poin dari titik lain. Anda juga dapat menambahkan
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
      ]
   }
});
6untuk 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 berikut 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 }

Contoh 2

Dalam contoh ini, Anda akan belajar bagaimana menemukan semua restoran (poin) dalam jarak 2 kilometer dari alamat tertentu (titik). Untuk melakukan kueri seperti itu, Anda dapat menggunakan$nearSphereminimum

{
	"createdCollectionAutomatically" : true,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}
2dan maksimum
{
	"createdCollectionAutomatically" : true,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}
6dari 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 berikut ini

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

Keterbatasan:

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