MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

$utilisation littérale dans Golang-mgo

Pour être complet, voici ce que vous essayez de faire :

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

Le problème ne vient pas de votre "Point" littéral, c'est juste une simple coïncidence. Si vous le changez en "Pt" par exemple, vous verrez toujours exactement le même message d'erreur.

Le Point dans le message d'erreur fait référence à $centerSphere , qui attend un point central et un rayon. Et la façon dont vous essayez de "passer" ça ne marche pas.

Cela fonctionne par exemple :

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

Votre requête d'origine n'a pas de sens, car vous essayez de trouver des documents dont l'emplacement se trouve à moins de 10 kilomètres de lui-même , ce qui correspondrait à tous les documents.

Au lieu de cela, vous voulez/devriez interroger les documents qui se trouvent à moins de 10 kilomètres d'un spécifique emplacement, et vous pouvez transmettre les coordonnées de cet emplacement spécifique à $centerSphere :

myLong, myLat := 10.0, 20.0

// ...

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

La requête complète :

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