在我的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之外的任何内容。
有什么我可以遗失的,或者有没有人遇到类似的问题并找到了灵魂?我试图寻找类似问题的解决方案但没有成功。
答案 0 :(得分:2)
似乎问题与字段类型有关。 TTL索引字段必须是日期类型。 https://docs.mongodb.com/manual/core/index-ttl/
如果文档中的索引字段不是日期或数组 持有日期值,文件不会过期。
您应该考虑使用新的Date
对象创建文档。
"expireAt" : new Date("2017-05-14T13:59:01.998Z")