为了账号安全,请及时绑定邮箱和手机立即绑定

MongoDB文档在go mongo-driver中返回键值对数组

MongoDB文档在go mongo-driver中返回键值对数组

Go
largeQ 2023-03-15 14:39:12
在我们的代码库中,我们有一个合并两个结构的函数,如下所示。func CombineStruct(s1 interface{}, s2 interface{}) error {    data, err := json.Marshal(s1)    if err != nil {        return err    }    return json.Unmarshal(data, s2)}我们使用上面的 func 来组合两个结构,如下所示。m := model.SomeModel{}CombineStruct(someStruct, &m)//above line merges two structs此外,目前我们所有的结构只有json标签bson还没有标签,我们是否需要bson在所有地方添加标签?for ex : type someStruct struct {    Field1  string       `json:"field1"`    Field2  string       `json:"field2"`    Field3  interface{}  `json:"field2"`}在上面someStruct我们也有接口类型的字段!现在我面临的问题是无论我们在哪里组合结构,我都会看到这些对象数据作为mongoDB一对数组,key-value如下所示:    "studentDetails" : [         {            "Key" : "Details",            "Value" : [                 [                     {                        "Key" : "Name",                        "Value" : "Bob"                    },                     {                        "Value" : "21",                        "Key" : "Age"                    }                 ]            ]        },         {            "Key" : "Enrolled",            "Value" : false        }     ],但我希望它像下面这样显示。不像key-value一对。    "studentDetails" : {        "Details" : [             {                "name" : "serverdr",                "age" : 21            },             {                "Enrolled" : false            }        ],它在我们旧的全局 sing mgo驱动程序中以上述方式显示对象。但是当我们使用函数 it作为键值对数组组合两个结构时,使用新的go-mongo驱动程序。CombineStruct()displays
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

我尝试了类似下面的方法,效果很好:)

所以基本上问题是mongo-driver默认为 unmarshalling as bson.Dfor structs of type interface{} where as mgo mgo-driver defaults to bson.M.

因此,我们必须在尝试与 建立连接时添加以下代码mongo-dbSetRegistry()选项作为clientOpts映射旧的 mgo 行为,以便在解组类型的结构时mongo-driver默认为,并且这不应将值显示为对bson.Minterface{}key-value

  tM := reflect.TypeOf(bson.M{})

    reg := bson.NewRegistryBuilder().RegisterTypeMapEntry(bsontype.EmbeddedDocument, tM).Build()

    clientOpts := options.Client().ApplyURI(SOMEURI).SetAuth(authVal).SetRegistry(reg)

    client, err := mongo.Connect(ctx, clientOpts)


查看完整回答
反对 回复 2023-03-15
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信