可以将单个字段设置为在MongoDB中过期吗?

时间:2014-09-15 01:41:43

标签: mongodb ttl

我想知道是否可以使文档中的单个字段过期而不是整个文档。

阅读TTL Indexes and Expiring Data上的文档后,似乎只能根据字段使文档到期,但我想确认一下。

这个问题的背景是我有一个Statistics集合,其中包含每个文档中每月,每周,每日和每小时统计信息的字段。我可以把它分成4个单独的集合,这样每个集合中的文档可以使用不同的TTL,但是我相信这也意味着我需要相应地将我的批量更新分解为每个集合的一个批量更新。如果可能的话,我想保持单个批量操作的效率优势。

3 个答案:

答案 0 :(得分:3)

到目前为止是不可能的。

如果它不是写入较重的数据库,那么您的解决方案就可以了。虽然如果你想降低写入频率,还有另一种解决方案:在某个服务器上运行一个定时器,用于从slave mongo实例每隔1分钟查询过期文档(或几分钟,取决于你需要的准确度)。然后手动更新这些文档。

答案 1 :(得分:0)

  

编辑:好的,因为支持者已经存在,我应该提到这个答案不准确,因为它将使整个文档到期而不是特定字段。很抱歉,我仍然会留下答案,因为它可能对某人有所帮助,希望如此。以下是我未经编辑的答案:

这实际上是可能的,因为MongoDB 2.2,see the official tutorial on MongoDB's documentation

示例:

首先在包含日期的属性上设置索引,expireAfterSeconds0

db.log_events.ensureIndex(
    { "expireAt": 1 },
    { expireAfterSeconds: 0 }
)

然后像往常一样插入您的文档,其中expireAt属性设置为文档过期的日期:

db.log_events.insert({
    "expireAt": new Date('July 22, 2013 14:00:00'),
    "logEvent": 2,
    "logMessage": "Success!"
})

您现在可以在同一个集合上拥有不同的到期日期。

答案 2 :(得分:0)

例如,在我的网站中,每个用户都有一个用户通知文档。每个通知都存储在此文档内的数组中,并带有其创建日期。当用户打开通知页面时,在发回通知之前,我会检查每个通知的日期,如果通知超过 10 天,我会在发回其他通知之前将其删除。就我而言,这不是一项昂贵的操作,因为通知通常很少