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.