Om volledig te zijn, dit is wat je eigenlijk probeert te doen:
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}}}}},
})
Het probleem ligt niet bij uw "Point"
letterlijk, het is gewoon toeval. Als je het verandert in "Pt"
u ziet bijvoorbeeld nog steeds exact dezelfde foutmelding.
Het Point
in de foutmelding verwijst naar $centerSphere
, die een middelpunt verwacht en een straal. En de manier waarop je het probeert te "passen", werkt niet.
Dit werkt bijvoorbeeld:
"$centerSphere": []interface{}{[]interface{}{1.0, 2.0}, 10 / 6378.11}
Uw oorspronkelijke zoekopdracht heeft geen zin, aangezien u documenten probeert te vinden waarvan de locatie zich binnen 10 kilometer van zelf bevindt , die overeenkomen met alle documenten.
In plaats daarvan wilt/moet u documenten opvragen die zich binnen 10 kilometer van een specifiek . bevinden locatie, en u mag de coördinaten van deze specifieke locatie doorgeven aan $centerSphere
:
myLong, myLat := 10.0, 20.0
// ...
"$centerSphere": []interface{}{[]interface{}{myLong, myLat}, 10 / 6378.11}
De volledige vraag:
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}}}}},
})