一尘不染

Golang-mgo中的$ literal用法

go

我不明白如何正确使用$ literal。我正在使用mgo.v2和mgo.v2 / bson包。

db.store.aggregate([
{"$project":{
    "location":{
        "type":{"$literal":"Point"},
        "coordinates":["$longitude","$latitude"]
    }}
},])

我使用上面的代码在mongodb中获取数据并正常工作,它给了我结果

 { "location":{
            "type":"Point",
            "coordinates":[77.587073,12.958794] 
        }}

我试图在golang中使用相同的内容,如下所示

pipe :=DB.C("store").Pipe([]bson.M{
        {"$project":bson.M{"location":
        bson.M{"type":
         bson.M{"$literal":"Point"},"coordinates":[]interface{}{"$longitude","$latitude"}}}}}

上面的代码,抛出一个错误

紧急:错误查询:BadValue:点必须是数组或对象

所以我就这样替换了

pipe :=DB.C("store").Pipe([]bson.M{
        {"$project":bson.M{"location":
        bson.M{"$literal":
         bson.M{"type":"Point"},"coordinates":[]interface{}{"$longitude","$latitude"}}}}})

但这也让我出错

紧急:此对象已经是运算符,不能用作文档表达式(在“坐标”处)

我的完整工作显示在下面的链接中, 我的工作在这里, 请帮助我解决此问题。谢谢


阅读 221

收藏
2020-07-02

共1个答案

一尘不染

完整地说,这是您实际尝试执行的操作:

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

问题不在于您的"Point"字面意义,仅是巧合。"Pt"例如,如果将其更改为,您仍然会看到完全相同的错误消息。

Point错误消息是指$centerSphere,这需要一个中心
和半径。而且您尝试“通过”的方式不起作用。

例如,这适用于:

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

原始查询没有意义,因为您尝试查找位置在距 其自身 10公里之内的文档,该文档将匹配所有文档。

相反,您希望/应该查询距 特定 位置10公里以内的文档,并且可以将此特定位置的坐标传递给$centerSphere

myLong, myLat := 10.0, 20.0

// ...

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

完整的查询:

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}}}}},
})
2020-07-02