我想使用上限集合作为缓存存储,我打算选择使用复合索引 - 键和到期日期。由于无法从上限集合中更新/删除,我将添加具有新到期日期的新条目,并选择具有未来到期日期的条目。
1)如果我在查询中使用Query.GTE("expiry", DateTime.Now)
,这是创建索引的最佳方式吗?
cacheColl.EnsureIndex(new IndexKeysBuilder().Ascending("key").Descending("expiry"));
2)我是否需要课堂上的[BsonId]属性?我知道“钥匙”不会是唯一的。记录是否需要具有唯一的id条目?
3)使用上限集合的唯一动机是限制缓存的最终大小(磁盘和内存),而不必自己删除过期的缓存项。是否有理由更喜欢定期收集和更新项目/删除过期项目?即使我删除了文档,我也读到空间没有被释放(我需要压缩吗?)
答案 0 :(得分:0)
1)该指数看起来正确。如果您只关心最新的。
,您还可以添加降序排序并将1限制为查询2)否。在上限集合中,_id不会自动创建,也不是必需的。我需要在普通集合上唯一的原因是因为默认情况下为该集合创建了_id上的唯一索引。
3)两种方法都有利有弊,哪种更好完全取决于您的需求。关于上限集合,您可能想要考虑的一件事是,在创建集合后调整集合大小并不容易。如果您稍后意识到您最初设置的尺寸太小而无法适应您所需的时间范围窗口,则会出现问题。
P.S。对于被删除文档的范围所使用的空间未被释放的部分,您是正确的。但是,Mongo会跟踪这些范围并尽可能重用它们。