1 回答

TA貢獻1843條經驗 獲得超7個贊
test_doc1 使用json.RawMessagewhich 本質上是[]byte為了將其存儲為表示字符串(文檔的原始表示形式)的整數數組。
test_doc2 將數據存儲為二進制數據,這是一種更緊湊的形式。
Go Mongo 驅動程序使用WriteBinaryWithSubtypejson 編碼數據的方法,但WriteArray使用RawMessage.
不同之處在于 mongo 端用于存儲這些數據的數據類型。一種是將字節切片存儲為整數數組,另一種是將數據存儲為具有子類型的二進制數據。與整數相比,二進制形式占用的空間更少。
深入挖掘后,我注意到 Go 驅動程序使用注冊表來確定如何將值編碼為 BSON。有一種專用于字節片的方法。
// ByteSliceEncodeValue is the ValueEncoderFunc for []byte.
func (dve DefaultValueEncoders) ByteSliceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
該方法使用WriteBinary()將字節片編碼為二進制數據的方法。
如果有自定義類型(即使它是底層[]byte),它將被視為切片類型并觸發切片的“默認編碼器”。
// SliceEncodeValue is the ValueEncoderFunc for slice types.
func (dve DefaultValueEncoders) SliceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
WriteArray()該方法依次使用該方法。
摘要:調用直接json.Marshal獲取 use[]byte類型,因此它們被視為 bson 二進制類型并以緊湊二進制形式存儲。json.RawMessage即使[]byte內部存儲數據被視為一個切片,一個整數切片,因此作為整數數組存儲在 mongo 中。
- 1 回答
- 0 關注
- 227 瀏覽
添加回答
舉報