Để hoàn thành, đây là những gì bạn thực sự cố gắng làm:
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}}}}},
})
Vấn đề không phải ở "Point"
của bạn theo nghĩa đen, đó chỉ là một sự trùng hợp ngẫu nhiên. Nếu bạn thay đổi nó thành "Pt"
ví dụ:bạn sẽ vẫn thấy cùng một thông báo lỗi.
Point
trong thông báo lỗi đề cập đến $centerSphere
, mong đợi một trung tâm điểm và một bán kính. Và cách bạn cố gắng "vượt qua" nó không hiệu quả.
Điều này hoạt động ví dụ:
"$centerSphere": []interface{}{[]interface{}{1.0, 2.0}, 10 / 6378.11}
Truy vấn ban đầu của bạn không hợp lý vì bạn cố gắng tìm tài liệu có vị trí nằm trong phạm vi 10 km tính từ chính nó , sẽ khớp với tất cả các tài liệu.
Thay vào đó, bạn muốn / nên truy vấn các tài liệu nằm trong phạm vi 10 km từ một cụ thể vị trí và bạn có thể chuyển tọa độ của vị trí cụ thể này cho $centerSphere
:
myLong, myLat := 10.0, 20.0
// ...
"$centerSphere": []interface{}{[]interface{}{myLong, myLat}, 10 / 6378.11}
Truy vấn hoàn chỉnh:
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}}}}},
})