登录
首页 >  Golang >  Go问答

开发一个自定义编码器/解码器,以进行mongo-driver文档的插入和检索

来源:stackoverflow

时间:2024-02-25 15:45:23 234浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《开发一个自定义编码器/解码器,以进行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 与集合函数(如 inseroneupdateonefindone 等)一起使用,如果不是实现我的目标(自定义(反)序列化)的最惯用的方法是什么。 p>

解决方案


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

像这样使用它:

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()

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

今天关于《开发一个自定义编码器/解码器,以进行mongo-driver文档的插入和检索》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>