登录
首页 >  Golang >  Go问答

使用mongo-go-driver将bson文档转换为M类型的方法

来源:stackoverflow

时间:2024-03-03 19:36:25 218浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《使用mongo-go-driver将bson文档转换为M类型的方法》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

根据mongo-driver中的文档https://godoc.org/go.mongodb.org/mongo-driver/bson 将 bson 解组到 interface{} 会将默认值放入 d

  1. 解组时,interface{} 类型的字段将遵循上面列出的 d/m 类型映射。 bson文档 解组到 interface{} 字段将被解组为 d。

如果我将对象存储在数据库中:

"data": {
   "property1": "value1",
   "property2": "value2",
}

当我使用“检索此数据时”

var result interface{}
err = collection.findone(ctx, filter).decode(&result)

它变成:

"data": [
   {"Key": "property1", "Value": "value1"},
   {"Key": "property2", "Value": "value2"}
]

与文档相符,类型d是键值的切片

我的问题是,有没有办法改变这种行为,以便它将数据解组到 m 中?

我的应用程序不知道数据的实际结构。它只是将 json 作为输入并存储在数据库中,因此我必须在 unmarhsal 时使用 interface{} 作为类型。如果它作为映射存储在数据库中,则应该以相同的方式检索数据。


解决方案


如果您传递 interface{} 然后解组为 bson.d,则这是默认功能,且无法更改。但您可以通过这种方式从 bson.d 转换为 bson.m

resultmap := result.(bson.d).map()

或者您可以在解组时直接使用 bson.m 变量。

var result bson.m
err = collection.findone(ctx, filter).decode(&result)

建立一个寄存器:

register := bson.newregistrybuilder().
        registertypemapentry(bsontype.embeddeddocument, reflect.typeof(primitive.m{})).
        build()

并将其设置为选项:

options.Client().SetRegistry(register)

终于介绍完啦!小伙伴们,这篇关于《使用mongo-go-driver将bson文档转换为M类型的方法》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>