För att vara komplett är det här du faktiskt försöker göra:
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}}}}},
})
Problemet ligger inte i din "Point"
bokstavligt talat, det är bara en ren slump. Om du ändrar den till "Pt"
till exempel kommer du fortfarande att se exakt samma felmeddelande.
Point
i felmeddelandet hänvisar till $centerSphere
, som förväntar sig en mittpunkt punkt och en radie. Och sättet du försöker "passera" fungerar inte.
Detta fungerar till exempel:
"$centerSphere": []interface{}{[]interface{}{1.0, 2.0}, 10 / 6378.11}
Din ursprungliga fråga är inte vettig, eftersom du försöker hitta dokument där platsen ligger inom 10 kilometer från själv , vilket skulle matcha alla dokument.
Istället vill/bör du söka efter dokument som ligger inom 10 kilometer från en specifik plats, och du kan skicka koordinaterna för denna specifika plats till $centerSphere
:
myLong, myLat := 10.0, 20.0
// ...
"$centerSphere": []interface{}{[]interface{}{myLong, myLat}, 10 / 6378.11}
Den fullständiga frågan:
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}}}}},
})