未能使MongoDB文档使用TTL索引到期

时间:2017-05-14 14:51:09

标签: javascript node.js mongodb

在我的Node.js应用程序中,我正在尝试将一个TTL索引添加到MongoDB集合中的日期字段,以使其在指定日期到期。

应用程序通过new Date()获取当前日期,通过getTime()方法将其转换为毫秒,添加用户指定的毫秒数(到期时间),并将结果转换回日期格式通过setTime()。结果将保存到JSON对象中名为expireAt的字段中,该对象最终会插入到MongoDB集合中。

结果看起来很好,因为它准确地表示根据UTC时区的日期调整到添加到当前日期的到期时间。例如: expireAt: "2017-05-14T13:59:01.998Z",大约在格林威治标准时间13:00插入,到期时间为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"});

这一次,索引是在我运行时创建的,as I could see using MongoDB Compass

然后我继续插入带有expireAt字段的文档,例如上面用expireAt: "2017-05-14T13:59:01.998Z"解释的字段。但是,距离文件应该已经过期已经将近一个小时了,但事实并非如此。此外,上图显示TTL索引的使用率为0,这表明由于某种原因插入的新文档尽管具有expireAt字段但未使用该索引。

此外,MongoDB指南针将expireAt字段的内容显示为类型字符串,而不是特定的BSON日期类型。但是,我不确定这是否只是Compass的事情,因为它不允许我将字段类型编辑为除String,Object或Array之外的任何内容。

有什么我可以遗失的,或者有没有人遇到类似的问题并找到了灵魂?我试图寻找类似问题的解决方案但没有成功。

1 个答案:

答案 0 :(得分:2)

似乎问题与字段类型有关。 TTL索引字段必须是日期类型。 https://docs.mongodb.com/manual/core/index-ttl/

  

如果文档中的索引字段不是日期或数组   持有日期值,文件不会过期。

您应该考虑使用新的Date对象创建文档。

"expireAt" : new Date("2017-05-14T13:59:01.998Z")