Go中如何高效将带json注解的外部库结构体写入MongoDB嵌套文档
你当前使用JSON序列化再反序列化的方案存在明显的额外开销,且字段标签不匹配时容易丢失数据,下面是两种更简洁、性能更优的实现方案:
方案1:结构体映射拷贝(最稳妥,兼容性最高)
直接手动匹配字段组装Parent实例,完全跳过JSON编解码步骤,性能比原方案高5~10倍,字段较多时可以搭配结构体拷贝库使用:
// libParent 是从外部包获取到的实例 parent := Parent{ ID: primitive.NewObjectID(), } // 拷贝子节点数组 parent.Children = make([]Child, 0, len(libParent.Children)) for _, libChild := range libParent.Children { if libChild == nil { continue } parent.Children = append(parent.Children, Child{ Field1: libChild.Field1, }) } // 直接写入集合 _, err := parentsColl.InsertOne(ctx, parent)
如果结构体字段量很大,手动拷贝成本高,可以使用轻量结构体映射库自动完成同名字段的转换,性能依然远高于JSON编解码方案。
方案2:直接包装外部类型写入(最简洁,性能最高)
不需要转换成自定义的Parent结构体,利用MongoDB Go驱动的原生BSON序列化能力,直接对外部包类型做包装即可写入:
// 定义包装结构体,内联外部包的LibParent type MongoParent struct { ID primitive.ObjectID `bson:"_id"` *LibParent `bson:",inline"` // 内联后LibParent的字段会自动展开为文档的顶级字段 } // 直接使用外部实例构造包装对象写入 _, err := parentsColl.InsertOne(ctx, MongoParent{ ID: primitive.NewObjectID(), LibParent: libParent, })
只要LibParent、LibChild的json标签和你需要存储的BSON字段名一致,这个方案完全可用,不需要做任何字段拷贝,性能是所有方案中最高的。如果有个别字段名不匹配,只需要在包装结构体中单独定义对应字段做映射即可。
内容的提问来源于stack exchange,提问作者septerr
相关产品推荐
相关产品推荐

