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
的一种方法是用虚拟数据预先填充我的存储桶。我想到了两个选项:
- 使用虚拟数据创建存储桶,保存它,然后重置其内容并再次保存
- 创建包含虚拟数据的存储桶并将其标记为 "pristine"。在第一次写入时,标志设置为 false 并且数据被重置。
缺点很明显,选项 1 需要两次 DB 写入,选项 2 在我的实体中需要额外的(非业务)代码。
可能我不会用任何解决方案便宜地下车。尽管如此,关于该问题的任何实际经验、最佳实践或提示?
设置:Spring数据MongoDB1.9.2,MongoDB3.2
据了解,您主要关心的是与文档大小增加相关的性能开销,导致文档重定位和索引更新。这对于 mmapv1 存储引擎是实际的,但是因为 MongoDB 版本 3.0 有可用的 WiredTiger 存储引擎没有这样的问题(检查类似的 question)。
在应用程序中我使用buckets
的概念来存储对象。所有的桶在创建时都是空的。其中一些可能会在 2 小时内填满 20 个对象的最大容量,有些则需要 6 个月。每个对象的大小几乎都是固定的,即我不希望它们的大小相差超过 10%,即满桶的大小也不会。实现看起来与此类似。
@Document
public class MyBucket {
// maximum capacity of 20
private List<MyObject> objects;
}
保持低 padding factor
的一种方法是用虚拟数据预先填充我的存储桶。我想到了两个选项:
- 使用虚拟数据创建存储桶,保存它,然后重置其内容并再次保存
- 创建包含虚拟数据的存储桶并将其标记为 "pristine"。在第一次写入时,标志设置为 false 并且数据被重置。
缺点很明显,选项 1 需要两次 DB 写入,选项 2 在我的实体中需要额外的(非业务)代码。
可能我不会用任何解决方案便宜地下车。尽管如此,关于该问题的任何实际经验、最佳实践或提示?
设置:Spring数据MongoDB1.9.2,MongoDB3.2
据了解,您主要关心的是与文档大小增加相关的性能开销,导致文档重定位和索引更新。这对于 mmapv1 存储引擎是实际的,但是因为 MongoDB 版本 3.0 有可用的 WiredTiger 存储引擎没有这样的问题(检查类似的 question)。