我一直在研究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
}
}
}
);
$推(以$位置),以添加到数组的前:
Collection.update(
{ _id: 'rsMH4GxtduZZfxQrC' },
{
$push: {
data: {
$each: newData,
$position: 0
}
}
}
);
的data
阵列文档中将会增长,由于从newData
添加的新对象。那么这种类型的文档更新会导致文档在磁盘上移动?
对于这个特定的系统,这些文档中的data
数组可以增长到75k以上的对象,所以如果这些文档确实在每次$ addToSet或$ push更新后在磁盘上移动,是否应该用插入75k空值(data: [null,null...null]
),然后可能使用$ set来替换随时间推移的值?谢谢!
谢谢你的回复,这非常有帮助!是的,这是时间序列数据。我基于进入的新对象(大约1个对象/秒)生成若干课程解决方案,这些文档是客户订阅中使用的那些文档。但我试图找出存储原始对象的最佳方式,我几乎只想保留在未来的需要,即需要重新生成课程决议,因为系统故障等。存储客户端不需要的数十万个这些大小的原始对象的最佳方式是什么? – 2015-03-02 21:03:59
目前,我有上述原始文章中描述的文档结构。有一个'data'字段,它是一个长度增长的数组。一旦该数组增长到75k大小的对象,我插入一个具有相同结构的新文档,并开始在那里添加拓扑。所以我累积了一堆长度为75k个对象的文档。选择75k是因为由于这个特定的对象大小,其中的75k等于〜7.5MB的文档大小,我不想接近16MB的硬限制以避免控制台警告。也许你也可以让我知道这种方法是否正确? – 2015-03-02 21:08:47