我已經閱讀了這篇關于使用官方 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 關注
- 178 瀏覽
添加回答
舉報
0/150
提交
取消