【问题标题】:Expire a Collection in Mongo using Casbah EnsureIndex使用 Casbah EnsureIndex 使 Mongo 中的集合过期
【发布时间】:2013-08-18 10:11:11
【问题描述】:

我正在尝试使用 Casbah 的 ensureIndex API 使 Mongo 中的集合过期。

基于此文档 http://docs.mongodb.org/manual/tutorial/expire-data/

我正在使用 casbah 提出的 ensureIndex API

 collection.ensureIndex(DBObject("status" -> 1, "expireAfterSeconds" -> 120))

在 2 分钟后过期集合 ...

集合没有被驱逐或过期。

我还有什么遗漏吗?

谢谢

【问题讨论】:

  • 你能添加一个示例文档吗?

标签: mongodb casbah


【解决方案1】:

有几件事需要检查:

  1. 您是否只是按照文档到 T 并尝试在您的文档中实际上不存在的 status 字段上创建索引? (至少得问问...
  2. status 字段是否只包含dates?理论上可以混合使用,但只有日期类型的文档才会被视为过期。
  3. 您是否检查了集合索引以确保索引已正确创建?

要从控制台检查索引,请运行:db.collection.getIndexes()。如果索引创建成功,请仔细检查您的文档中是否有相应的status 字段以及它们是否是正确的日期。

单独添加索引不会为您创建日期字段 - 您需要将其添加到文档中或使用不属于任何其他索引的现有日期字段。

另请注意,来自文档:

TTL 通过在后台任务中删除文档来索引过期数据 每 60 秒运行一次

因此,如果您有 120 second 到期,请记住,文件可能会保留 120 seconds179 seconds,取决于文件到期时间和后台任务的最后期限跑了。

edit:如 cmets 中所述 - 无法根据 TTL 索引删除集合本身,该索引只会使集合中的文档过期。

【讨论】:

  • status 是一个日期字段,我设法让它工作......它现在使集合中的所有文档都过期。是否也有删除集合的方法或标志,尤其是在所有文档都被驱逐的情况下。
  • 感谢您的详细解答。是的,mongod 实例每“x”分钟运行一次,因此 TTL 可能存在潜在偏差,这对我来说很好
  • 不,集合本身不能用 TTL 删除,只能删除其中的文档。
  • 啊 - 是的,当您说 collection 没有过期时,我以为您指的是文件。上面的@Derick 在这里是正确的。
  • @kmfk,所以将其添加到您的答案中;-)
【解决方案2】:

我认为,您以错误的方式传递选项。

应该是-

collection.ensureIndex(DBObject("status" -> 1), DBObject("expireAfterSeconds" -> 120))

而不是-

collection.ensureIndex(DBObject("status" -> 1, "expireAfterSeconds" -> 120))

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 2011-12-09
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多