在我的 Node.js 应用程序中,我试图将 TTL 索引添加到 MongoDB 集合中的日期字段,以使其在指定日期过期。
应用程序通过 获取当前日期new Date()
,通过getTime()
方法将其转换为毫秒,加上用户指定的毫秒数(到期时间),并通过 将结果转换回日期格式setTime()
。结果将保存到以expireAt
JSON 对象命名的字段中,该对象最终会插入到 MongoDB 集合中。
结果看起来不错,因为它准确地表示了根据 UTC 时区调整到添加到当前日期的到期时间的日期。例如:expireAt: "2017-05-14T13:59:01.998Z"
,它在大约 13:00 UTC 插入,过期时间为 1 小时。
为了添加 TTL 索引,我在 Node 应用程序中添加了以下行:
collection.createIndex({"expireAt": 1}, {expireAfterSeconds: 0, name: "_exp"});
然而,这给了我一个MongoError: Values in the index key pattern cannot be 0
错误并且没有创建索引,所以我切换到:
collection.createIndex({"expireAt": 1}, {expireAfterSeconds: 1, name: "_exp"});
这一次,当我运行它时创建了索引,正如我使用 MongoDB Compass 所看到的
然后我继续插入带有expireAt
字段的文档,例如上面用expireAt: "2017-05-14T13:59:01.998Z"
. 然而,距离文档应该过期已经快一个小时了,但它没有。此外,上图显示 TTL 索引的使用率为 0,这表明由于某种原因,插入的新文档尽管具有该expireAt
字段,但并未使用该索引。
此外,MongoDB 指南针将expireAt
字段的内容显示为字符串类型,而不是特定的 BSON 日期类型。但是,我不确定这是否只是 Compass 的事情,因为它不允许我将字段类型编辑为字符串、对象或数组以外的任何内容。
有什么我可能会遗漏的吗,或者有没有人遇到过类似的问题并找到了灵魂?我试图在类似问题中寻找解决方案,但没有成功。
似乎问题与字段类型有关。TTL 索引字段必须是日期类型。https://docs.mongodb.com/manual/core/index-ttl/
如果文档中的索引字段不是日期或保存日期值的数组,则文档不会过期。
您应该考虑使用新Date
对象创建文档。
"expireAt" : new Date("2017-05-14T13:59:01.998Z")
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句