一段时间后删除嵌套对象 - MongoDB + Node.js

Deleting nested object after time - MongoDB + Node.js

我找到了有关 MongoDB 的 TTL 的信息,不幸的是,它只适用于整个文档。我希望能够在我的 Node.js 服务器上一段时间(2 周)后删除用户的通知。可以想象,通知是一个对象数组,作为用户 MongoDB Model 中的一个字段,这样我就可以在登录时获取它们,而无需进一步请求。所以如果我有这样的东西:

notifications: [{
        notifType: String,
        story: String,
        seen: Boolean,
        createdTime: Date,
        from: {
            name: String,
            username: String,
            id: mongoose.Schema.ObjectId
        }
    }]

如何在 2 周后删除通知,从 createdTime 开始计算?

如果在定期批处理过程中剔除它们不可行,我会将检查作为获取文档的任何代码的一部分。您可能在数据库中有超过两周的通知,但假设您只有一个地方发生 'get',您可以在那里进行检查并保证没有未修剪的带有陈旧通知的文档被返回。

为什么默认的 TTL 实现不符合您的预期? 假设您的 createdTime 字段具有 2015-02-22:10:20 作为值,使用 TTL 功能您可以

db.notifications.ensureIndex( { "createdTime": 1 }, { expireAfterSeconds: 3600 } )

这将在 2 小时后清除该值,同样您可以将其设置为 2 周。 除非您的要求是每条记录都有不同的通知到期时间,否则默认实现应该完美无缺。

您还可以编写一些代码作为定期删除记录的解决方案的一部分,比如在每天开始时或在插入每条记录时(不推荐后者)。