Aby zakończyć, oto, co faktycznie próbujesz zrobić:
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}}}}},
})
Problem nie dotyczy Twojego "punktu"
dosłownie, to tylko zbieg okoliczności. Jeśli zmienisz go na "Pt"
na przykład nadal będziesz widzieć dokładnie ten sam komunikat o błędzie.
Punkt
w komunikacie o błędzie odnosi się do $centerSphere
, który oczekuje środka punktu i promień. A sposób, w jaki próbujesz „przejść”, nie działa.
Działa to na przykład:
"$centerSphere": []interface{}{[]interface{}{1.0, 2.0}, 10 / 6378.11}
Twoje oryginalne zapytanie nie ma sensu, ponieważ próbujesz znaleźć dokumenty, których lokalizacja znajduje się w promieniu 10 kilometrów od samej , który pasowałby do wszystkich dokumentów.
Zamiast tego chcesz / powinieneś wysyłać zapytania do dokumentów, które znajdują się w promieniu 10 kilometrów od konkretnego lokalizacji i możesz przekazać współrzędne tej konkretnej lokalizacji do $centerSphere
:
myLong, myLat := 10.0, 20.0
// ...
"$centerSphere": []interface{}{[]interface{}{myLong, myLat}, 10 / 6378.11}
Pełne zapytanie:
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}}}}},
})