我知道这个网站更喜欢讨论的答案,但我对此非常感兴趣。 什么是足以摆脱存储在集合中的旧消息的方法?由于它们是消息,因此会有大量消息。
我到目前为止使用
删除邮件if (Messages.find().count() > 100) {
Messages.remove({
_id: Messages.findOne({}, { sort: { createdAt: 1 } })._id
});
}
我也试过使用过期。
还有其他/更有效的方法吗?
答案 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 }})
以上将删除超过一小时的日志文档。