当前位置: 首页 > 面试题库 >

Golang-mgo中的$ literal用法

韦修文
2023-03-14
问题内容

我不明白如何正确使用$ 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"}}}}})

但这也让我出错

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

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


问题答案:

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

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


 类似资料:
  • 问题内容: 有人知道我们在mongodb shell中对golang mgo / bson使用的聚合命令等效吗? 像这样: 问题答案: 假设这是您的收藏夹: GoDoc参考: Collection.Pipe文档 管道及其方法

  • 问题内容: 我尝试在MongoDB中找到我的用户,但是当我运行此代码时: 只是告诉我: 并且不要返回其他值! 非常感谢您的参与! 问题答案: 只是您应该在结构名称的开头使用大写字母!而且你也不需要 你可以写 : 祝好运 :))

  • 问题内容: 我正在尝试将多重排序查询传递给mgo软件包的“排序”参数(请参阅https://godoc.org/labix.org/v2/mgo#Query.Sort)。 如果参数是动态的(当前保存在切片中),如何将其转换为有效的排序字符串。 一个有效的例子是: 但是,如果将“ -created_when”和“ -title”保留在一个切片中,则尝试使用切片联接,例如: 该查询无法正常工作。 如何

  • 问题内容: 我读过多个有关使用mgo保存文件的博客,但找不到满足特定需求的解决方案,请大声喊叫! 下面在MongoDb中插入对象: 下面能够保存文件: 现在,在插入对象之前,我需要将上述文件设置为: 我的结构对象: 用外行术语来说,问题是:如何使用mgo驱动程序通过GoLang结构在mongoDb中插入文件(从HTML表单接收)? 谢谢阅读!:) 更新: PDF存储在MongoDB中,如下所示:

  • 问题内容: 我在使用mgo将mongodb中保留golang结构时遇到问题。 问题是,在完成Insert()调用后,唯一保留在数据库中的是空文档 我检查struct字段是否确实已设置,并且不为空。关于为什么这样的任何想法。提示表示赞赏:)谢谢 问题答案: 您需要通过以大写字母开头的字段名称来导出字段。

  • 问题内容: 我在golang中使用mgo库进行mongo操作,这是我的代码: 我得到这个输出: 但是我检查了一下,文档存在于mongo中,但是到这里没有结果,我不知道我在想什么… 问题答案: 如错误消息所提示,对象ID的长度恰好为12个字节(12个字节的数据)。您看到的24个字符长的ID是ID的12个字节的十六进制表示形式(1个字节=> 2个十六进制数字)。 使用该函数获取十六进制表示形式是否可用