sql >> Databáze >  >> NoSQL >> MongoDB

$literal použití v Golang-mgo

Abych byl úplný, toto se ve skutečnosti snažíte udělat:

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

Problém není ve vašem "Point" doslova, je to jen pouhá náhoda. Pokud jej změníte na "Pt" například stále uvidíte přesně stejnou chybovou zprávu.

Point v chybové zprávě odkazuje na $centerSphere , který očekává středový bod a poloměr. A způsob, jakým se to snažíte „předat“, nefunguje.

Funguje to například:

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

Váš původní dotaz nedává smysl, protože se snažíte najít dokumenty, kde je poloha v okruhu 10 kilometrů od sebe , což by odpovídalo všem dokumentům.

Místo toho chcete / měli byste se dotazovat na dokumenty, které jsou do 10 kilometrů od konkrétního umístění a souřadnice tohoto konkrétního umístění můžete předat do $centerSphere :

myLong, myLat := 10.0, 20.0

// ...

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

Úplný dotaz:

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



  1. Node.js a Passport Object nemají žádnou metodu validPassword

  2. Nejlepší způsob, jak provádět fulltextové vyhledávání v MongoDB a Mongoose

  3. Mongoose - Uložit pole řetězců

  4. Dotazování na pole vnořených objektů