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

我已经阅读了这篇关于使用官方 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 pseudocode

mongoCollection := client.Database("db").Collection("coll").WithRegistry(myReg)

// Now InserOne() honor myReg (type *bsoncodec.Registry) when serialize `val` and puting it into mongodb

mongoCollection.InsertOne(context.TODO(), val)

我浏览了 API 文档,发现有Marshaler和Unmarshaler接口,但是通过注册表方式,我可以在不同的集合上以不同的方式(反)序列化相同的类型(例如,从旧格式迁移到新格式时) )。


所以问题是如何*bsoncodec.Registry与集合函数(如InserOne,等)一起使用UpdateOne,FindOne如果不是实现我的目标(自定义(反)序列化)的最惯用方式。


HUX布斯
浏览 128回答 1
1回答

手掌心

该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()。因此,当您不从旧格式迁移到新格式时,您可以将注册表设置为“客户端”级别并“完成”。只要驱动程序处理您注册的自定义类型的值,就会应用您的注册表和自定义编码器/解码器。
打开App,查看更多内容
随时随地看视频慕课网APP