2017-11-04 72 views
0

我想在3天后刪除用戶帳戶,如果他們不驗證他們的電子郵件。由於調度程序效率低下,我正在尋找一種方法來在MongoDB中安排這種刪除。如果用戶驗證電子郵件,我還需要一種取消方法。在n天后刪除MongoDB文檔

我正在使用mgo作爲API for MongoDB,而且我正在運行最新的Go(1.9)。

+0

[通過設置TTL從集合中過期數據](https://docs.mongodb.com/manual/tutorial/expire-data/)確實是第一個搜索結果的種類。 –

+0

[MongoDB:如何從集合中刪除舊記錄?](https://stackoverflow.com/questions/46441006/mongodb-how-to-remove-older-records-from-a-collection) –

回答

1

這可以在MongoDB的3.4版

實現您可以沿着使用MongoDB的TTL指數與partial index expression

嘗試users集合添加以下指標:

db.users.ensureIndex(
{ created_at:1}, 
{ expireAfterSeconds:259200, 
    partialFilterExpression:{"verified" : false}}) 

這與刪除所有誰不驗證,它已經3天了,他們加入這些用戶TTL指數。

+0

謝謝。當有人驗證他的帳戶時,是否也可以刪除此檢查?所以mongodb doens不會每次檢查這個。 expireAfterSeconds是相對於我創建文檔的時間還是執行此命令的時間? – Florian

+0

對於第一部分,您必須從應用程序端進行更新(在用戶接受時將其設置爲true)。 expireAfterSec指的是您創建文檔的時間。 – Astro

+0

@Florian無論什麼(iirc,即使沒有TTL索引),運行TTL expier的後臺進程都會每分鐘運行一次。不用擔心。 –

0

蒙戈TTL索引只支持一個日期時間,沒有進一步的條件邏輯多於

if NowDate() > fieldDate { killMe() }

唯一的解決方法我能想到的是...(從MongoDB documentation:萃取)

If the indexed field in a document is not a date or an array that holds a date value(s), the document will not expire.

因此,當用戶驗證他的電子郵件時,將您的字段設置爲null可能會訣竅。

歡呼