sql >> Databasteknik >  >> NoSQL >> MongoDB

$literal användning i Golang-mgo

För att vara komplett är det här du faktiskt försöker göra:

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

Problemet ligger inte i din "Point" bokstavligt talat, det är bara en ren slump. Om du ändrar den till "Pt" till exempel kommer du fortfarande att se exakt samma felmeddelande.

Point i felmeddelandet hänvisar till $centerSphere , som förväntar sig en mittpunkt punkt och en radie. Och sättet du försöker "passera" fungerar inte.

Detta fungerar till exempel:

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

Din ursprungliga fråga är inte vettig, eftersom du försöker hitta dokument där platsen ligger inom 10 kilometer från själv , vilket skulle matcha alla dokument.

Istället vill/bör du söka efter dokument som ligger inom 10 kilometer från en specifik plats, och du kan skicka koordinaterna för denna specifika plats till $centerSphere :

myLong, myLat := 10.0, 20.0

// ...

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

Den fullständiga frågan:

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. Java-drivrutinmotsvarighet för JavaScript-skalets Object.bsonsize( doc )?

  2. Hur man filtrerar array i underdokument med MongoDB

  3. Vårsessionsdata Redis - Få giltiga sessioner, nuvarande användare från Redis Store

  4. MongoDB - $project kapslade dokument till rotnivå