亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用于插入或獲取 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 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號