第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么 json.RawMessage 會(huì)放大 mongoDb 文檔大?。?/h1>

以下代碼嘗試通過以下方式將新文檔插入到 mongoDB 中g(shù)o.mongodb.org/mongo-driver    data := "this is test string blablablablablablabla"    type Doc struct {        Version int "json:version, bson:version"        Data   string   "json:data, bson:data"    }    dd := Doc{Version: 21, Data: data}    dObj, _ := json.Marshal(dd)    queryFilter := bson.M{"version": 1}    update1 := bson.M{"$set": bson.M{"version": 1, "data": json.RawMessage(dObj)}}    // insert data with json.RawMessage    _, err := db.Mongo("test").Collection("test_doc1").UpdateOne(context.Background(), queryFilter, update1, options.Update().SetUpsert(true))    if err != nil {        fmt.Println("failed to insert doc1")    }    update2 := bson.M{"$set": bson.M{"version": 1, "data": (dObj)}}    // insert data without json.RawMessage    _, err = db.Mongo("test").Collection("test_doc2").UpdateOne(context.Background(), queryFilter, update2, options.Update().SetUpsert(true))    if err != nil {        fmt.Println("failed to insert doc2")    }的內(nèi)容test_doc1是"data": json.RawMessage(dObj),而 的內(nèi)容test_doc2是"data": (dObj)。文檔內(nèi)容如下db.test_doc1.find(){ "_id" : ObjectId("5da164a950d625a5b2e5d23e"), "version" : 1, "data" : [ 123, 34, 86, 101, 114, 115, 105, 111, 110, 34, 58, 50, 49, 44, 34, 68, 97, 116, 97, 34, 58, 34, 116, 104, 105, 115, 32, 105, 115, 32, 116, 101, 115, 116, 32, 115, 116, 114, 105, 110, 103, 32, 98, 108, 97, 98, 108, 97, 98, 108, 97, 98, 108, 97, 98, 108, 97, 98, 108, 97, 98, 108, 97, 34, 125 ] }db.test_doc2.find(){ "_id" : ObjectId("5da164a950d625a5b2e5d249"), "version" : 1, "data" : BinData(0,"eyJWZXJzaW9uIjoyMSwiRGF0YSI6InRoaXMgaXMgdGVzdCBzdHJpbmcgYmxhYmxhYmxhYmxhYmxhYmxhYmxhIn0=") }檢查以上兩個(gè)文件的大小后Object.bsonsize(db.test_doc2.findOne())111Object.bsonsize(db.test_doc1.findOne())556的尺寸test_doc1比 的尺寸更大test_doc2。為什么?每個(gè)bson 文檔數(shù)組 - 數(shù)組的文檔是一個(gè)普通的 BSON 文檔,其鍵為整數(shù)值,從 0 開始并按順序繼續(xù)。例如,數(shù)組 ['red', 'blue'] 將被編碼為文檔 {'0': 'red', '1': 'blue'}。鍵必須按數(shù)字升序排列。Bson數(shù)組可以占用更多的磁盤空間嗎?我對(duì)嗎?MongoDB 版本:4.0
查看完整描述

1 回答

?
藍(lán)山帝景

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊

test_doc1 使用json.RawMessagewhich 本質(zhì)上是[]byte為了將其存儲(chǔ)為表示字符串(文檔的原始表示形式)的整數(shù)數(shù)組。


test_doc2 將數(shù)據(jù)存儲(chǔ)為二進(jìn)制數(shù)據(jù),這是一種更緊湊的形式。


Go Mongo 驅(qū)動(dòng)程序使用WriteBinaryWithSubtypejson 編碼數(shù)據(jù)的方法,但WriteArray使用RawMessage.


不同之處在于 mongo 端用于存儲(chǔ)這些數(shù)據(jù)的數(shù)據(jù)類型。一種是將字節(jié)切片存儲(chǔ)為整數(shù)數(shù)組,另一種是將數(shù)據(jù)存儲(chǔ)為具有子類型的二進(jìn)制數(shù)據(jù)。與整數(shù)相比,二進(jìn)制形式占用的空間更少。


深入挖掘后,我注意到 Go 驅(qū)動(dòng)程序使用注冊表來確定如何將值編碼為 BSON。有一種專用于字節(jié)片的方法。


// ByteSliceEncodeValue is the ValueEncoderFunc for []byte.

func (dve DefaultValueEncoders) ByteSliceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {

該方法使用WriteBinary()將字節(jié)片編碼為二進(jìn)制數(shù)據(jù)的方法。


如果有自定義類型(即使它是底層[]byte),它將被視為切片類型并觸發(fā)切片的“默認(rèn)編碼器”。


// SliceEncodeValue is the ValueEncoderFunc for slice types.

func (dve DefaultValueEncoders) SliceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {

WriteArray()該方法依次使用該方法。


摘要:調(diào)用直接json.Marshal獲取 use[]byte類型,因此它們被視為 bson 二進(jìn)制類型并以緊湊二進(jìn)制形式存儲(chǔ)。json.RawMessage即使[]byte內(nèi)部存儲(chǔ)數(shù)據(jù)被視為一個(gè)切片,一個(gè)整數(shù)切片,因此作為整數(shù)數(shù)組存儲(chǔ)在 mongo 中。


查看完整回答
反對(duì) 回復(fù) 2023-07-31
  • 1 回答
  • 0 關(guān)注
  • 224 瀏覽

添加回答

了解更多

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)