我已经阅读了这篇关于使用官方 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()
。
因此,当您不从旧格式迁移到新格式时,您可以将注册表设置为“客户端”级别并“完成”。只要驱动程序处理您注册的自定义类型的值,就会应用您的注册表和自定义编码器/解码器。
- 1 回答
- 0 关注
- 146 浏览
添加回答
举报
0/150
提交
取消