在n天后删除MongoDB文档

问题描述:

我想在3天后删除用户帐户,如果他们不验证他们的电子邮件。由于调度程序效率低下,我正在寻找一种方法来在MongoDB中安排这种删除。如果用户验证电子邮件,我还需要一种取消方法。在n天后删除MongoDB文档

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

+0

[通过设置TTL从集合中过期数据](https://docs.mongodb.com/manual/tutorial/expire-data/)确实是第一个搜索结果的种类。 –

+0

[MongoDB:如何从集合中删除旧记录?](https://*.com/questions/46441006/mongodb-how-to-remove-older-records-from-a-collection) –

这可以在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的后台进程都会每分钟运行一次。不用担心。 –

蒙戈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可能会诀窍。

欢呼