2017-05-14 34 views
0

在我的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之外的任何其他类型。

有什么我可能会失踪,或有人遇到类似的问题,发现灵魂?我试图寻找类似问题的解决方案,但没有成功。

+1

我''新的日期包裹的价值()''只是写的分贝,现在它被正确保存日期格式和文件之前似乎是正确到期。它看起来像对象被保存为JSON然后发送到HTTP请求的主体。 –

回答

1

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

如果文档中的索引字段是不是日期或 保持日期值(S)的阵列,该文件将不会过期。

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

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

+0

感谢您的回答。这正是我所做的并且无法工作的原因。正如我在上面的回复中所评论的,似乎问题在于我将它保存回JSON,因此它可能再次成为常规字符串。考虑到问题已经解决,我会将您的答案标记为已接受。 –

+0

谢谢,我发布答案时没有看到您的评论。我很高兴问题解决了。 –