MongoDB 文档存储优化

MongoDB document storage optimization

我们有一个 MongoDB 包含数十万个文档,其中每个文档都有多个字段,包括一个数组,该数组会随着时间的推移而增加(每天一个额外的条目,其中每个条目包含一个整数和一个日期)。

为了优化每日更新文档的速度,为每个文档预留更多磁盘 space 是否有意义,这样每次我们向数组添加条目时都不需要移动文档?

预分配 space 在这种情况下对您帮助不大。由于您的文档迟早会增加到超出填充 space,无论如何都会有文档迁移。但是,如果填充因子较高,则会增加磁盘使用方面的开销,而且可能会增加很多。

您的数据模型有缺陷。对于可能增长到无穷大的字段,您应该为日常事件使用第二个集合,参考基础文档。

{
  _id: baseDocId,
  …
}

将是您的基础文档,然后

{
   _id: dailyEventId,
   base: baseDocId,
   date: someISODate,
   …
}

单个事件的文档。获取已知基地的所有事件仍然很容易

db.events.find({base: baseDocId})

但是添加新事件时文档迁移没有问题,不需要增加填充开销,而且您也超过了 16MB 的文档大小限制。