Untuk melengkapi, inilah yang sebenarnya Anda coba lakukan:
pipe := DB.C("store").Pipe([]bson.M{
{"$project": bson.M{"location": bson.M{"type": bson.M{"$literal": "Point"}, "coordinates": []interface{}{"$longitude", "$latitude"}}}},
{"$match": bson.M{"location": bson.M{"$geoWithin": bson.M{"$centerSphere": []interface{}{"$coordinates", 10 / 6378.11}}}}},
})
Masalahnya bukan pada "Point"
Anda literal, itu hanya kebetulan belaka. Jika Anda mengubahnya menjadi "Pt"
misalnya, Anda masih akan melihat pesan kesalahan yang sama persis.
Point
dalam pesan kesalahan merujuk ke $centerSphere
, yang mengharapkan titik center pusat dan radius. Dan cara Anda mencoba "lulus" tidak berhasil.
Ini berfungsi misalnya:
"$centerSphere": []interface{}{[]interface{}{1.0, 2.0}, 10 / 6378.11}
Permintaan awal Anda tidak masuk akal, karena Anda mencoba mencari dokumen yang lokasinya berjarak 10 kilometer dari itu sendiri , yang akan cocok dengan semua dokumen.
Alih-alih, Anda ingin / harus menanyakan dokumen yang berada dalam jarak 10 kilometer dari spesifik lokasi, dan Anda dapat meneruskan koordinat lokasi spesifik ini ke $centerSphere
:
myLong, myLat := 10.0, 20.0
// ...
"$centerSphere": []interface{}{[]interface{}{myLong, myLat}, 10 / 6378.11}
Kueri lengkapnya:
myLong, myLat := 10.0, 20.0
pipe := DB.C("store").Pipe([]bson.M{
{"$project": bson.M{"location": bson.M{"type": bson.M{"$literal": "Point"}, "coordinates": []interface{}{"$longitude", "$latitude"}}}},
{"$match": bson.M{"location.coordinates": bson.M{"$geoWithin": bson.M{"$centerSphere": []interface{}{[]interface{}{myLong, myLat}, 10 / 6378.11}}}}},
})