我正在尝试创建 TTL 索引以删除以下示例文档“生成”字段中超过 30 分钟的文档
示例文档:{“_id”:ObjectId(“5850308c077b3d1ccc11cef0”),“generated”:NumberLong(“1481650316760”)}
问题 1)是否可以这样做,因为“生成”字段不是日期类型 2)是否有其他方法可以在不修改文档结构的情况下实现此目的
答案1
是否可以这样做,因为“生成”字段不是日期类型
与 MongoDB 3.4 一样,TTL 索引仅支持具有 BSON 日期值的字段:
If the indexed field in a document is not a date or an array that holds
date values, the document will not expire.
有没有其他方法可以实现这一点而无需修改文档结构
如果您希望支持基于字段类型或内置 TTL 索引所提供内容之外的比较的文档过期,您可以随时编写自己的脚本并使用类似cron
公用事业(Linux/Unix 操作系统)或任务计划程序(视窗)。
在这种情况下,您的脚本将删除generated
NumberLong 值早于所需到期截止时间(例如 30 分钟)的所有文档。shell 中的查询mongo
类似于:
db.collection.remove(
{
generated: {
// Expire documents older than half hour: 30 minutes * 60 seconds * 1000 ms
$lt: (Date.now() - (30 * 60 * 1000))
}
}
)
你可以用你最喜欢的应用程序语言编写它,将其作为.js
文件传递给shell,或者使用mongo
向 shell 传递 JavaScript 代码。有关更多信息,请参阅mongo
--eval
为 mongo Shell 编写脚本在 MongoDB 手册中。