【发布时间】:2020-02-09 14:20:47
【问题描述】:
以下代码尝试通过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。为什么?
Array - 数组的文档是一个普通的 BSON 文档,键为整数值,从 0 开始并按顺序继续。例如,数组 ['red', 'blue'] 将被编码为文档 {'0': 'red', '1': 'blue'}。键必须按数字升序排列。
Bson 阵列会占用更多磁盘空间吗?我对吗?
MongoDB 版本:4.0
【问题讨论】:
-
文件明显不同。如前所述,一种形式是 32 位的 “整数数组” (即使实际数值都小于 255 )。另一种形式只是完整的二进制数据。所以只是纯字节。当然,一个比另一个小得多。不是“苹果对苹果”的比较。