摆脱集合中旧消息/帖子的最佳方法是什么?

时间:2016-05-11 07:21:11

标签: javascript mongodb meteor

我知道这个网站更喜欢讨论的答案,但我对此非常感兴趣。 什么是足以摆脱存储在集合中的旧消息的方法?由于它们是消息,因此会有大量消息。

我到目前为止使用

删除邮件
if (Messages.find().count() > 100) {
    Messages.remove({
        _id: Messages.findOne({}, { sort: { createdAt: 1 } })._id
    });
}

我也试过使用过期。

还有其他/更有效的方法吗?

1 个答案:

答案 0 :(得分:2)

根据您如何定义到期年龄,有两种方法可以解决这个问题。

第一个是使用"TTL indexes"根据时间自动修剪某些集合。例如,您可能有一个日志表来记录所有应用程序事件,而您只想保留最后一小时的日志。要实现此目的,请在日志文档中添加日期字段。这将指示文档的年龄。 MongoDB将使用此字段来确定您的文档是否已过期且需要删除:

db.log_events.insert({
   "name": "another log entry"
   "createdAt": new Date()
})

现在在此字段中为您的集合添加TTL索引。在下面的示例中,我使用了expireAfterSeconds值3600,它将在每小时后消除日志:

db.log_events.createIndex({ "createdAt": 1 }, { expireAfterSeconds: 3600 })

因此,对于您的情况,您需要以秒为单位定义适当的到期时间。有关更多详细信息,请参阅expiration of data using TTL indexes上的MongoDB文档。

第二种方法涉及根据日期范围查询手动删除文档。对于上面给出相同集合的示例,要删除一小时以前的文档,您需要创建一个相对于当前时间戳表示一小时前的日期,并将该日期用作集合的remove方法中的查询:

var now = new Date(),
    hourAgo = new Date(now.getTime() - (60 * 60 * 1000));

db.log_events.remove({"createdAt": { "$lte": hourAgo }})

以上将删除超过一小时的日志文档。