【发布时间】:2015-03-02 11:36:39
【问题描述】:
我一直在研究 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 字段:
$addToSet 添加到数组的末尾:
Collection.update(
{ _id: 'rsMH4GxtduZZfxQrC' },
{
$addToSet: {
data: {
$each: newData
}
}
}
);
$push (with $position) 添加到数组的前面:
Collection.update(
{ _id: 'rsMH4GxtduZZfxQrC' },
{
$push: {
data: {
$each: newData,
$position: 0
}
}
}
);
由于从newData 添加的新对象,文档中的data 数组将增长。那么这种类型的文档更新会导致文档在磁盘上移动吗?
对于这个特定的系统,这些文档中的 data 数组可以增长到超过 75k 个对象,因此如果这些文档在每次 $addToSet 或 $push 更新后确实在磁盘上移动,那么应该定义文档插入时有 75k 空值 (data: [null,null...null]),然后可能使用 $set 随着时间的推移替换值?谢谢!
【问题讨论】: