gpt4 book ai didi

node.js - mongoDB时域触发器?

转载 作者:太空宇宙 更新时间:2023-11-04 01:37:10 24 4
gpt4 key购买 nike

我有一个基于 Node 的后端,与 mongoDb 实例集成。数据库有一组日历事件,每个事件都有一个唯一的日期时间字段。我正在尝试考虑在设定时间前 15 分钟执行提醒功能的最佳方式。

我想到的唯一想法是使用 setInterval 一致地查询数据库,然后运行该函数。有更好的办法吗?

最佳答案

显然 setInterval 并提取数据库似乎是最简单的方法。下面的解决方案可以被视为数据库启动这些计划事件的替代方案,这样您将获得而不是拉取方法。

假设您有一个简单的集合 scheduledEvents,其中包含一个 ISODate 类型的字段 scheduledAt,例如:

{ "_id" : ObjectId("5c457cb554651d56ffe0c759"), "scheduledAt" : ISODate("2019-01-21T08:03:01.129Z") }

然后您可以创建 TTL index在那个集合上。基本上这个想法是,当 scheduledAt 成为过去的日期时,MongoDB 数据库服务器将定期删除这些文档。

db.scheduledEvents.createIndex( { "scheduledAt": 1 }, { expireAfterSeconds: 30} )

在幕后有一个在数据库服务器上运行的预定作业,它查询并删除所有这些文档。这些文档不会立即删除 - 会有一点延迟,但您应该可以接受。

现在您有了一个调度机制,因此您所需要做的就是从代码中订阅这些事件。为此,您可以利用 Change Streams .

要使用它们,您必须将数据库作为副本集运行(可以是 standalone replica set )。然后,在您的应用程序代码中,您可以使用以下代码订阅 scheduledEvents 集合:

const changeStreamCursor = db.scheduledEvents.watch();

function pollStream(cursor) {
while (!cursor.isExhausted()) {
if (cursor.hasNext()) {
var change = cursor.next();
if(change.operationType === "delete"){
// your logic goes here
}
}
}
pollStream(cursor);
}

pollStream(changeStreamCursor);

显然 scheduledEvents 集合可以包含与您的业务逻辑相关的其他字段,并且可以在更改流监听器内访问这些字段。

关于node.js - mongoDB时域触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54201066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com