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

用于插入或获取 mongo-driver 文档的自定义编码器/解码器

用于插入或获取 mongo-driver 文档的自定义编码器/解码器

Go
HUX布斯 2022-07-11 15:34:22
我已经阅读了这篇关于使用官方 go mongo 驱动程序对自定义对象进行编码和解码的友好文章。有一个很好的例子,如何将它们编组为扩展的 json 格式(bson.MarshalExtJSONWithRegistry)。但我想知道如何将此文档放入集合中InserOne()(然后从中获取)。看看这个伪代码:// myReg - variable created according to linked article in question.// WithRegistry do **not** exist in mongo-driver lib is part of pseudocodemongoCollection := client.Database("db").Collection("coll").WithRegistry(myReg)// Now InserOne() honor myReg (type *bsoncodec.Registry) when serialize `val` and puting it into mongodbmongoCollection.InsertOne(context.TODO(), val)我浏览了 API 文档,发现有Marshaler和Unmarshaler接口,但是通过注册表方式,我可以在不同的集合上以不同的方式(反)序列化相同的类型(例如,从旧格式迁移到新格式时) )。所以问题是如何*bsoncodec.Registry与集合函数(如InserOne,等)一起使用UpdateOne,FindOne如果不是实现我的目标(自定义(反)序列化)的最惯用方式。
查看完整描述

1 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

Database.Collection()方法具有“可选”options.CollectionOptions参数,该参数确实具有设置bsoncodec.Registry. 如果您使用配置了注册表的选项获取您的集合,则该注册表将用于对该集合执行的所有操作。

像这样使用它:

opts := options.Collection().SetRegistry(myReg)
c := client.Database("db").Collection("coll", opts)

引用我的相关答案:如何在解组 MongoDB 文档时忽略空值?

注册表可以在多个级别设置/应用,甚至可以设置/应用到一个整体mongo.Client,或者一个mongo.Database或只是一个mongo.Collection,当获取它们时,作为它们选项的一部分,例如options.ClientOptions.SetRegistry()

因此,当您不从旧格式迁移到新格式时,您可以将注册表设置为“客户端”级别并“完成”。只要驱动程序处理您注册的自定义类型的值,就会应用您的注册表和自定义编码器/解码器。


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

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