数据库触发器可以用于实现复杂的数据交互。触发器可以在相关数据更改时更新信息(例如,当用户头像被替换,触发用户活动信息的更新),或者在新数据插入时与服务交互(例如,当添加新的日历条目时,触发电子邮件通知)。
在这篇文章中,您将学习以下内容
有许多原因要在数据库中使用触发器
MongoDB Atlas支持数据库触发器,允许用户简单地编写在数据库事件触发时执行的函数,处理服务器管理并提供方便的用户界面(这意味着需要编写的代码更少)。Atlas还提供支持现代应用程序复杂需求的其他类型的触发器。
MongoDB提供三种类型的触发器
首先,我们将启动一个免费的MongoDB Atlas账户,然后向数据库中添加示例数据。
然后,我们将使用数据库DDL触发器构建一个用例。这将更新“lastupdated”字段,在“sample_mflix.movies”集合(MongoDB提供的示例数据集的一部分)中插入新文档时。
这是一个简单示例,展示了设置触发器的简便性。然而,触发器的使用方式有无限可能,可以覆盖您的特定用例。请参阅我们的触发器代码片段获取更多想法。
在云中创建您的MongoDB Atlas集群的步骤如下
然后选择云提供商和地区。在本例中,我将选择Azure Virginia-East2(eastus2)并更新集群名称为“DevCluster”。然后点击“创建集群”。
等待几分钟,您将在所选的云提供商和地区中构建一个全新的MongoDB Atlas集群。
现在我们已经构建了一个免费的MongoDB Atlas集群,可以按照以下简单步骤向集群中添加一些示例数据
在MongoDB Atlas主界面中,点击“...”省略号按钮,然后选择“加载示例数据集”。
然后点击“添加触发器”按钮,并设置以下设置
完成触发器设置后,向下滚动到函数部分,并使用以下代码在将新文档插入到movies集合时更新“lastupdated”字段为当前时间戳
exports = async function(changeEvent) {
const movies= context.services.get("DevCluster").db("sample_mflix").collection("movies");
try {
await movies
.updateOne(
{ _id: changeEvent.documentKey._id },
{
$currentDate: {
lastupdated: true
}
}
);
console.log("Successfully updated the lastupdated field");
} catch (err) {
console.error("Failed to update the lastupdated field", err);
}
return;
};
我们已经定义了一个数据库触发器。接下来,我们将向“movies”集合中插入一个新的文档以测试并确保触发器正在工作。
{title:"MongoDB FTW"}
您将看到插入的新文档,其中“lastupdated”字段填充了当前时间戳。
触发器是一种向数据库提供自动化功能的好方法。但不要过度使用它们,因为触发器基于更改流,可能会给MongoDB集群带来压力。(更多信息请参阅此处:[https://docs.mongodb.com/realm/reference/service-limitations/#change-streams](https://docs.mongodb.com/realm/reference/service-limitations/#change-streams))。
具有太多触发器的数据库可能会使事件变慢,并给操作生成过多的延迟。
基于业务需求设计触发器可以防止业务逻辑渗透到您的应用程序代码中,使您的数据质量更高且更一致。
MongoDB数据库触发器存储在组织中特定Realm应用程序的项目级别。(Atlas触发器将自动为您配置此应用程序。)
触发器可以用于许多用例,例如在文档编辑时更新最后更新日期,记录用户资料的最后一次登录日期,或将特定字段的更新自动更改为大写,以提供集合中的一致性。
触发器为数据库开发者提供了一种方法,可以自动执行基于传入的DML语句或其他事件的一组代码。