我一直在研究 MongoDB,我知道强烈建议在插入时完全构建(预分配)文档结构,这样将来对该文档的更改不需要移动该文档磁盘周围。这在使用 $addToSet 或 $push 时适用吗?
例如,假设我有以下文档:
"_id" : "rsMH4GxtduZZfxQrC",
"createdAt" : ISODate("2015-03-01T12:08:23.007Z"),
"market" : "LTC_CNY",
"type" : "recentTrades",
"data" : [
{
"date" : "1422168530",
"price" : 13.8,
"amount" : 0.203,
"tid" : "2435402",
"type" : "buy"
},
{
"date" : "1422168529",
"price" : 13.8,
"amount" : 0.594,
"tid" : "2435401",
"type" : "buy"
},
{
"date" : "1422168529",
"price" : 13.79,
"amount" : 0.594,
"tid" : "2435400",
"type" : "buy"
}
]
我正在使用以下命令之一添加新的对象数组(newData
)到data
field:
$addToSet 添加到数组末尾:
Collection.update(
{ _id: 'rsMH4GxtduZZfxQrC' },
{
$addToSet: {
data: {
$each: newData
}
}
}
);
$push (使用 $position)添加到数组的前面:
Collection.update(
{ _id: 'rsMH4GxtduZZfxQrC' },
{
$push: {
data: {
$each: newData,
$position: 0
}
}
}
);
The data
文档中的数组将由于添加的新对象而增长newData
。那么这种类型的文档更新会导致文档在磁盘上移动吗?
对于这个特定的系统,data
这些文档中的数组可以增长到最多 75k 个对象,因此,如果这些文档确实在每次 $addToSet 或 $push 更新后在磁盘上移动,则该文档是否应该定义为 75k null(data: [null,null...null]
)插入,然后也许使用 $set 随着时间的推移替换值?谢谢!