【发布时间】:2014-10-10 16:40:46
【问题描述】:
我听说 mongo 可以做到,但我不知道怎么做。 mongo可以创建集合,将来会自动删除,我可以设置吗?还是 Mongo 无法做到这一点?
【问题讨论】:
-
每次截断集合并重新添加数据时,删除集合及其索引然后重新创建它们对 mongod 来说会有点压力。但是,补充一点,我不相信 MongoDB 有这种能力
标签: mongodb collections
我听说 mongo 可以做到,但我不知道怎么做。 mongo可以创建集合,将来会自动删除,我可以设置吗?还是 Mongo 无法做到这一点?
【问题讨论】:
标签: mongodb collections
在第一次写入操作(插入、更新插入、索引创建)时自动创建集合。所以这个魔法被覆盖了。
如果您的删除是基于时间的,您可以使用cron 或at 来运行这个小脚本
mongo yourDBserver/yourDB --eval 'db.yourCollection.drop()’
正如 Sammaye 指出的那样,创建索引是一项昂贵的操作。我认为您的数据模型有问题。对于语义区分文档,我宁愿在它们上创建一个字段来执行此操作,并设置文档有效的到期日期或创建日期和时间范围,并使用 TTL 索引来删除所有这些文档。
要使用过期日期,您必须将一个字段设置为 ISODate 并创建一个没有持续时间的 TTL 索引:
db.yourColl.ensureIndex({"yourExpirationDateField":1},{expireAfterSeconds:0})
如果您希望文档在创建后一周内有效,您可以使用以下内容:
db.yourColl.ensureIndex({"yourCreationDate":1},{expireAfterSeconds:604800})
无论哪种方式,都会发生以下情况:每分钟都会有一个名为 TTLMonitor 的后台线程唤醒,获取服务器的所有 TTL 索引并开始处理它们。它扫描 TTL 索引,查找日期值,添加为“expireAfterSeconds”指定的值,并删除它现在确定为无效的所有文档。这个过程需要一些时间,所以不要期望文档在它们过期的那一刻就被删除。
这种方法的一大优势是:您不需要维护任何触发逻辑,删除是在后台自动完成的,您不会对应用程序施加任何负载。此外,使用到期日期,您可以非常精细地控制文档的到期时间。
缺点是……嗯,如果我想找到一个,那就是你必须为每个文档插入一个创建日期,或者计算并插入一个到期日期。而且您必须在应用程序生命周期内向 mongod/mongos 发送一次管理命令...
【讨论】:
mongodb 不能自动删除集合,但它可以自动删除 BSON 记录。您只需要在 BSON 记录中存在的日期字段上设置 ttl(Time to live) 索引。 你可以在这里阅读更多MongoDb: Expire Data from Collections by Setting TTL
【讨论】: