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 关注
- 186 浏览
添加回答
举报