2017-05-14 72 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

謝謝,我發佈答案時沒有看到您的評論。我很高興問題解決了。 –