MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

$utilizzo letterale in Golang-mgo

Per essere completo, questo è ciò che effettivamente provi a fare:

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

Il problema non è con il tuo "Point" letterale, è solo una semplice coincidenza. Se lo cambi in "Pt" ad esempio, vedrai sempre lo stesso identico messaggio di errore.

Il Point nel messaggio di errore fa riferimento a $centerSphere , che prevede un punto centrale e un raggio. E il modo in cui provi a "passare" non funziona.

Funziona ad esempio:

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

La tua domanda originale non ha senso, poiché cerchi di trovare documenti in cui la posizione si trova entro 10 chilometri da stessa , che corrisponderebbe a tutti i documenti.

Invece vuoi/dovresti interrogare documenti che si trovano entro 10 chilometri da uno specifico posizione e puoi passare le coordinate di questa posizione specifica a $centerSphere :

myLong, myLat := 10.0, 20.0

// ...

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

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