Mongodb - 集合中的数据子集到期

时间:2014-09-19 10:28:38

标签: mongodb indexing cron crontab

我想知道只有一个集合的子集过期的最佳方法是什么。

在一个集合中,我存储转换数据和点击数据。 我想要存储的点击数据让我们一周 和转换数据一年。

在我的“客户”系列中,我存储了以下内容: {“_ id”:ObjectId(“53f5c0cfeXXXXXd”),“appid”:2,“action”:“conversion ”,“uid”:“2_b2f5XXXXXX3ea3”,“iid”:“2_2905040001”,“ t“:ISODate(”2014-07-18T15:01:00.001Z“)} 和 {“_ id”:ObjectId(“53f5c0cfe4b0d9cd24847b7d”),“appid”:2,“action”:“view”,“uid”:“2_b2f58679e6f73ea3”,“iid”:“2_2905040001”,“ t“:ISODate(”2014-07-18T15:01:00.001Z“)} 对于点击数据

那么我应该执行ensureIndex还是类似cronjob的东西?

提前谢谢

1 个答案:

答案 0 :(得分:4)

您可以使用几种内置技术。最明显的是TTL collection,它会根据日期/时间字段自动删除文档。这里需要注意的是,为了方便起见,你会失去一些控制权。你将无法控制所有时间自动删除,并且删除不是免费的 - 它们需要写锁定,需要刷新到磁盘等。基本上你会想要测试你的系统是否可以处理你将要做的删除程度以及它如何影响你的表现。

另一种选择是capped collection - 上限集合在磁盘上预先分配并且不会增长(索引除外),它们不会像TTL删除那样具有相同的开销(尽管再次,不是免费的)。如果您具有一致的插入速率和文档大小,则可以计算出与希望保留数据的时间范围相对应的空间大小。也许20GiB是5天,所以为了安全起见,你要分配30GiB并确保不时监控以确保你的数据大小没有改变。

之后您将进入更多手动选项。例如,您可以简单地使用一个字段将文档标记为过期或未过期,也许是一个布尔值 - 这意味着文档到期将是就地更新,并且就MongoDB操作而言可以获得尽可能高的效率。然后,当删除及其对性能的影响不太重要时,您可以在系统安静的时间批量删除过期文档。

另一种选择:您可以每隔X天以可预测的模式开始写入新数据库,以便您的应用程序知道当前数据库的名称,并确定之前的名称.2。创建新数据库时,你删除比前两个旧的那个,并且基本上总是只有3个(适当的子数)。这听起来像是很多工作,但好处是删除旧数据只是一个drop database命令,它只是在操作系统级别取消链接/删除数据文件,从IO角度来看比从随机删除更有效来自一系列大文件的文档。这个模型还允许一个非常干净的备份模型 - mongodump旧数据库,压缩和存档,然后丢弃等。

正如您所看到的,这里有很多权衡 - 您可以追求方便,IO效率,数据库效率或介于两者之间的某些东西 - 这一切都取决于您的要求是什么以及最适合您的特定用途案例和制度。