Pengantar Bab
Bab ini memperkenalkan kueri geospasial MongoDB dengan Golang, termasuk cara menyimpan informasi lokasi dan melakukan kueri berdasarkan jarak.
Tutorial Prasyarat
Tip: Jika Anda belum familiar dengan sintaks kueri MongoDB, harap baca panduan MongoDB terlebih dahulu. Sintaks ekspresi yang digunakan untuk mengoperasikan MongoDB di Golang sama.
Persiapkan Data Uji
Menulis beberapa data yang mengandung koordinat geografis ke dalam koleksi coll
. Bidang location
menyimpan koordinat lintang dan bujur dari toko-toko.
docs := []interface{}{
bson.D{
{"title", "Ayam Hainan Kukus"},
{"location", bson.D{
{"type": "Point"},
{"coordinates": bson.A{116.240015, 39.899617}}
}},
},
bson.D{
{"title", "Babi Panggang Guangdong"},
{"location", bson.D{
{"type": "Point"},
{"coordinates": bson.A{116.268854, 39.900276}}
}},
},
bson.D{
{"title", "Gees Panggang Guangdong"},
{"location", bson.D{
{"type": "Point"},
{"coordinates": bson.A{116.264905, 39.902778}}
}},
},
bson.D{
{"title", "Pancake Shanxi"},
{"location", bson.D{
{"type": "Point"},
{"coordinates": bson.A{116.288938, 39.893164}}
}},
},
bson.D{
{"title", "Pangsit Hangzhou"},
{"location", bson.D{
{"type": "Point"},
{"coordinates": bson.A{116.286191, 39.910415}}
}},
}
}
result, err := coll.InsertMany(context.Background(), docs)
Kueri berdasarkan Jarak
Gunakan operator $near
untuk melakukan kueri jarak. Dengan asumsi koleksi coll
menyimpan data toko, dan bidang location
menyimpan koordinat setiap toko, kode berikut mengkuerikan toko terdekat dari lokasi saya (jarak minimum 1000 meter, jarak maksimum 5000 meter).
cursor, err := coll.Find(
context.Background(),
bson.D{{"location", bson.D{
{"$near": bson.D{
{"$geometry": bson.D{{"type":"Point"}, {"coordinates": bson.A{116.288938,39.893164}}}, // Koordinat saat ini saya
{"$minDistance": 1000}, // Jarak minimum
{"$maxDistance": 5000} // Jarak maksimum
}}
}}}
)
Ekspresi setara:
{
location:
{ $near :
{
$geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, // Koordinat saya
$minDistance: 1000, // Jarak minimum
$maxDistance: 5000 // Jarak maksimum
}
}
}
Ekspresi tersebut sama dengan ekspresi asli MongoDB, satu-satunya perbedaan adalah mendeskripsikannya kembali menggunakan struktur data Golang.