sql >> Base de Datos >  >> NoSQL >> MongoDB

$uso literal en Golang-mgo

Para ser completo, esto es lo que realmente intentas hacer:

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}}}}},
})

El problema no está en tu "Point" literal, es solo una mera coincidencia. Si lo cambia a "Pt" por ejemplo, seguirá viendo exactamente el mismo mensaje de error.

El Point en el mensaje de error se refiere a $centerSphere , que espera un punto central y un radio. Y la forma en que intentas "pasarla" no funciona.

Esto funciona, por ejemplo:

"$centerSphere": []interface{}{[]interface{}{1.0, 2.0}, 10 / 6378.11}

Su consulta original no tiene sentido, ya que intenta encontrar documentos donde la ubicación está dentro de los 10 kilómetros de mismo , que coincidiría con todos los documentos.

En su lugar, desea / debe consultar documentos que se encuentran dentro de los 10 kilómetros de un específico ubicación, y puede pasar las coordenadas de esta ubicación específica a $centerSphere :

myLong, myLat := 10.0, 20.0

// ...

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

La 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}}}}},
})