MongoDB 的实体预填充以避免用 Spring 填充

Entity prepopulation for MongoDB to avoid padding with Spring

在应用程序中我使用buckets 的概念来存储对象。所有的桶在创建时都是空的。其中一些可能会在 2 小时内填满 20 个对象的最大容量,有些则需要 6 个月。每个对象的大小几乎都是固定的,即我不希望它们的大小相差超过 10%,即满桶的大小也不会。实现看起来与此类似。

@Document
public class MyBucket {
  // maximum capacity of 20
  private List<MyObject> objects;
}

保持低 padding factor 的一种方法是用虚拟数据预先填充我的存储桶。我想到了两个选项:

  1. 使用虚拟数据创建存储桶,保存它,然后重置其内容并再次保存
  2. 创建包含虚拟数据的存储桶并将其标记为 "pristine"。在第一次写入时,标志设置为 false 并且数据被重置。

缺点很明显,选项 1 需要两次 DB 写入,选项 2 在我的实体中需要额外的(非业务)代码。

可能我不会用任何解决方案便宜地下车。尽管如此,关于该问题的任何实际经验、最佳实践或提示?

设置:Spring数据MongoDB1.9.2,MongoDB3.2

据了解,您主要关心的是与文档大小增加相关的性能开销,导致文档重定位和索引更新。这对于 mmapv1 存储引擎是实际的,但是因为 MongoDB 版本 3.0 有可用的 WiredTiger 存储引擎没有这样的问题(检查类似的 question)。