1 回答

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 中。
- 1 回答
- 0 關(guān)注
- 224 瀏覽