在我们的代码库中,我们有一个合并两个结构的函数,如下所示。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.D
for structs of type interface{}
where as mgo
mgo-driver defaults to bson.M
.
因此,我们必须在尝试与 建立连接时添加以下代码mongo-db
,SetRegistry()
选项作为clientOpts
映射旧的 mgo 行为,以便在解组类型的结构时mongo-driver
默认为,并且这不应将值显示为对bson.M
interface{}
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)
- 1 回答
- 0 关注
- 91 浏览
添加回答
举报
0/150
提交
取消