在我的Node.js应用程序中,我试图添加TTL索引到MongoDB collecion中的日期字段,以使其在指定日期到期。未能使MongoDB文档过期使用TTL索引
应用程序通过new Date()
获取当前日期,将其转换为毫秒通过getTime()
方法,增加了许多由用户(到期时间)指定毫秒的,并且将结果通过setTime()
转换回日期格式。结果保存在最终插入到MongoDB集合的JSON对象中的名为expireAt
的字段中。
结果看起来不错,因为它准确地表示根据UTC时区调整为添加到当前日期的到期时间的日期。例如: expireAt: "2017-05-14T13:59:01.998Z"
,它是在UTC的13:00附近插入的,过期时间为1小时。
要添加的TTL指数,我添加了下面一行在我节点应用:
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
FIEL文件d,例如上面用expireAt: "2017-05-14T13:59:01.998Z"
解释的那个。但是,文件应该过期了将近一个小时,而且还没有。另外,上面的图片显示TTL索引有0个用法,这表明由于某种原因插入的新文档没有使用该索引,尽管有expireAt
字段。
此外,MongoDB指南针将expireAt
字段的内容显示为类型字符串,而不是特定的BSON日期类型。但是,我不确定这是否只是一个Compass的事情,因为它不允许我将字段类型编辑为除String,Object或Array之外的任何其他类型。
有什么我可能会失踪,或有人遇到类似的问题,发现灵魂?我试图寻找类似问题的解决方案,但没有成功。
我''新的日期包裹的价值()''只是写的分贝,现在它被正确保存日期格式和文件之前似乎是正确到期。它看起来像对象被保存为JSON然后发送到HTTP请求的主体。 –