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

在我们的代码库中,我们有一个合并两个结构的函数,如下所示。


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



largeQ
浏览 92回答 1
1回答

慕村225694

我尝试了类似下面的方法,效果很好:)所以基本上问题是mongo-driver默认为 unmarshalling as bson.Dfor structs of type interface{} where as mgo mgo-driver defaults to bson.M.因此,我们必须在尝试与 建立连接时添加以下代码mongo-db,SetRegistry()选项作为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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go