在mongo中插入文档后,根据条件发送电子邮件

时间:2016-09-24 09:05:34

标签: javascript mongodb email database

我有一个api,可以将文档插入到mongo集合中。根据插入文档的时间,我需要在插入时间后24小时发送电子邮件,并在插入时间后48小时发送短信。我打算用_id来查找插入时间。

我的问题是,解决这个问题的最佳方法是什么?我想到的一个解决方案是每分钟运行一个脚本并查找24小时和48小时前创建的文档。

我觉得这可能是一种矫枉过正,因为我一直在查询数据库,是否有更好的解决方案或者为此目的使用mongo从根本上是错误的?

2 个答案:

答案 0 :(得分:0)

如果脚本失效一小时,您将不会发送您应该在60分钟内发送的邮件。你应该为邮件保留一个容错标记。

这可能是一个更好的主意:在每个文档中,都有名为isMailSent24isMailSent48的字段。插入时,您将始终使用'isMailSent24': false'isMailSent48': false插入。因为很明显,邮件还没有发送给这些文件。

您的脚本运行的每一分钟都应该遵循:

  1. 使用'isMailSent24': falsenow - creationTime > 24 hours
  2. 查找文档

    这将返回我们尚未发送邮件24小时的文件,并且在创建后超过24小时。这意味着是时候为他们发送邮件了。大多数情况下,now - creationTime将是24小时1分钟,因为脚本每分钟运行一次。但是如果您的脚本失败了30分钟,它仍然会发送24小时30分钟前创建的文档的邮件。这是容错的,也是一种更好的做法

    1. 发送这些文件的邮件。
    2. 将其修改为'isMailSent24': true
    3. 'isMailSent48'的例行程序也是如此。

答案 1 :(得分:0)

为此,您可以使用TTL索引维护另一个25小时的集合。

当您将一个条目放入主集合时,将一个相应的文档插入到新集合中,其日期字段的TTL索引应为25小时。

现在每15分钟运行一次调度程序并检查24小时后创建的所有文档,验证是否没有为该文档发送邮件并尝试发送邮件,一旦您能够发送邮件,就更新文档您已发送邮件并使用TTL索引更新日期字段。现在在24之后,我们再次发送短信,但这次不更新日期字段,因此当目的填写时,文档将被自行删除。

它的好处是您的主要集合将免于每分钟繁重的查询调用和后续更新。第二个好处是邮件和短信都被发送后,文件将被自己删除,所以不用担心清理它。

现在有一些我必须提到的后备,一,因为你从每分钟变为15分钟会有一个滞后而且不会是24小时,我认为在邮件和短信的情况下这些滞后是可以接受的。或者您可以将频率更改为5分钟。其他的事情是我没有想到失败的情况,如果邮件发送不成功,也许你可以再次拿起,但无论如何你应该用TTL更新日期字段,否则在发送短信之前文件将被删除24小时后。