【问题标题】:custom encoder/decoder for insert or geting documents for mongo-driver用于插入或获取 mongo-driver 文档的自定义编码器/解码器
【发布时间】:2020-10-28 13:40:33
【问题描述】:

我已经阅读了这个friendly article,关于使用官方 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 文档,发现有 MarshalerUnmarshaler 接口,但是通过注册表方式,我可以在不同的集合上以不同的方式(反)序列化相同的类型(例如,当从旧格式迁移到新格式)。

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

【问题讨论】:

    标签: mongodb go mongo-go


    【解决方案1】:

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

    像这样使用它:

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

    引用我的相关回答:How to ignore nulls while unmarshalling a MongoDB document?

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

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

    【讨论】:

    • 您知道如何解码带有子文档作为结构的文档吗?我看到的所有解码器示例都来自原语。
    • @lucaswxp 这取决于你想如何解组它。如果嵌入式结构不需要“特殊”照顾,您可以调用默认解组逻辑。如果您有具体示例或其他问题,应将其作为新问题发布。
    猜你喜欢
    • 2017-12-18
    • 2020-12-16
    • 2012-10-22
    • 2020-06-27
    • 2020-07-06
    • 2017-11-21
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    相关资源
    最近更新 更多