MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Uso de $literal em Golang-mgo


Para ser completo, isso é o que você realmente tenta fazer:
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}}}}},
})

O problema não está no seu "Ponto" literal, é apenas uma mera coincidência. Se você alterar para "Pt" por exemplo, você ainda verá exatamente a mesma mensagem de erro.

O Ponto na mensagem de erro refere-se a $centerSphere , que espera um ponto central e um raio. E do jeito que você tenta "passar" não funciona.

Isso funciona por exemplo:
"$centerSphere": []interface{}{[]interface{}{1.0, 2.0}, 10 / 6378.11}

Sua consulta original não faz sentido, pois você tenta encontrar documentos em que o local esteja a menos de 10 quilômetros de ele mesmo , que corresponderia a todos os documentos.

Em vez disso, você deseja / deve consultar documentos que estejam a 10 quilômetros de um específico localização, e você pode passar as coordenadas desta localização específica para $centerSphere :
myLong, myLat := 10.0, 20.0

// ...

"$centerSphere": []interface{}{[]interface{}{myLong, myLat}, 10 / 6378.11}

A consulta completa:
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}}}}},
})