为什么json.RawMessage扩大mongoDb文档的大小?

问题描述 投票:0回答:1

以下代码尝试通过go.mongodb.org/mongo-driver将新文档插入到mongoDB中>

    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")
    }

test_doc1的内容为"data": json.RawMessage(dObj)test_doc2的内容为"data": (dObj)

文档内容如下

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=") }

检查以上两个文件的大小之后

Object.bsonsize(db.test_doc2.findOne())
111

Object.bsonsize(db.test_doc1.findOne())
556

test_doc1的大小大于test_doc2。为什么?

bson doc

Array-数组的文档是一个普通的BSON文档,具有键的整数值,从0开始并依次继续。例如,数组['red','blue']将被编码为文档{'0':'red','1':'blue'}。键必须按数字升序排列。

Bson阵列可以占用更多磁盘空间吗?我对吗?

MongoDB版本:4.0

以下代码尝试通过go.mongodb.org/mongo-driver数据将新文档插入mongoDB:=“这是测试字符串blablablablablablabla”类型Doc struct {Version int“ ...

mongodb go bson
1个回答
-1
投票

test_doc1使用实际上是json.RawMessage[]byte,因此将其存储为代表字符串的整数数组。

© www.soinside.com 2019 - 2024. All rights reserved.