公告推出MongoDB 8.0,有史以来最快的MongoDB!阅读更多 >>推出MongoDB 8.0,有史以来最快的MongoDB!>>

什么是数据库触发器?

数据库触发器是在数据库事件发生时执行服务器端逻辑的代码——例如,当数据被添加、更新、替换或删除时。

数据库触发器可以用于实现复杂的数据交互。触发器可以在相关数据更改时更新信息(例如,当用户头像被替换,触发用户活动信息的更新),或者在新数据插入时与服务交互(例如,当添加新的日历条目时,触发电子邮件通知)。

在这篇文章中,您将学习以下内容

数据库触发器的主要用途是什么?

有许多原因要在数据库中使用触发器

  • 审计:在数据库中添加字段以捕获谁更改了记录。例如,合规团队有记录任何记录更新的业务需求。使用触发器在最后更新用户字段中记录这些信息可以满足该要求。
  • 数据一致性:确保输入数据库的数据处于一致格式——例如,确保数据库中的城市字段是大写。为此,可以创建一个触发器来执行该功能,确保数据保持一致,不受传入城市字段格式的限制。
  • 数据完整性:添加条件逻辑,确保一组字段具有有效数据组合——例如,确保订单记录的开始日期在订单记录的结束日期之前。使用触发器可以帮助确保在事务提交之前发生这种情况。
  • 数据事件:在集合中发生的复杂事件系列中添加触发器——例如,在添加一组数据后生成报告,或者在足够参与者加入特定游戏时向用户发送通知。

MongoDB Atlas中的数据库触发器

MongoDB Atlas支持数据库触发器,允许用户简单地编写在数据库事件触发时执行的函数,处理服务器管理并提供方便的用户界面(这意味着需要编写的代码更少)。Atlas还提供支持现代应用程序复杂需求的其他类型的触发器。

根据文档,触发器适用于运行MongoDB版本3.6或更高版本的MongoDB Atlas集群

数据库触发器的类型

MongoDB提供三种类型的触发器

  • 数据库触发器:在文档更新、添加或删除时执行某些类型的操作。
  • 定时触发器:在特定时间或指定间隔发生的预定操作。MongoDB Atlas使用直观的CRON表达式语言来设置定时触发器。这些触发器类型可以很简单,例如运行每日清理临时记录的过程,也可以生成关于交易异常的逐分钟报告。
  • 身份验证触发器(仅限Realm):在创建或删除用户或在MongoDB登录时发生的操作。这类触发器用于执行用户维护或用户审计跟踪,适用于Realm应用程序。

如何在MongoDB Atlas中创建触发器

首先,我们将启动一个免费的MongoDB Atlas账户,然后向数据库中添加示例数据。

然后,我们将使用数据库DDL触发器构建一个用例。这将更新“lastupdated”字段,在“sample_mflix.movies”集合(MongoDB提供的示例数据集的一部分)中插入新文档时。

这是一个简单示例,展示了设置触发器的简便性。然而,触发器的使用方式有无限可能,可以覆盖您的特定用例。请参阅我们的触发器代码片段获取更多想法。

在云中创建您的MongoDB Atlas集群的步骤如下

  1. 免费注册MongoDB Atlas
  2. MongoDB Atlas提供了一个说明性的向导,用于创建初始设置的组织、项目和管理员用户组件。
  3. 初始设置完成后,您就可以通过几个简单的步骤构建一个免费的MongoDB集群。首先,点击“构建集群”按钮,然后选择免费选项。
  4. 然后选择云提供商和地区。在本例中,我将选择Azure Virginia-East2(eastus2)并更新集群名称为“DevCluster”。然后点击“创建集群”。在云中创建您的mongodb atlas集群

  5. 等待几分钟,您将在所选的云提供商和地区中构建一个全新的MongoDB Atlas集群。

view of new atlas cluster

现在我们已经构建了一个免费的MongoDB Atlas集群,可以按照以下简单步骤向集群中添加一些示例数据

  1. 在MongoDB Atlas主界面中,点击“...”省略号按钮,然后选择“加载示例数据集”。加载示例数据集

  2. 这需要几分钟时间,但将在MongoDB Atlas中填充一些示例数据集,我们将使用这些数据集构建数据库触发器用例。
  3. 点击“Collections”按钮,您将进入“Collections”选项卡,以查看已创建的示例数据库。

collections tab

  1. 现在,我们的示例数据已创建,让我们创建一个简单的数据库触发器,作为当新文档被插入到“sample_mflix.movies”集合时我们的用例的一部分。点击“Triggers”菜单选项

  1. 然后点击“添加触发器”按钮,并设置以下设置

    1. 您可以给数据库触发器起任何您想要的名称。在下面的示例中,我将其命名为“trigMovieLastUpdated”。
    2. 在“链接数据源”中选择或链接一个新的集群,选择您的数据库和相关的集合——在本例中,“sample_mflix”和“movies”。
    3. 请确保选择“插入”操作类型。将“操作类型”视为触发触发器的因素,无论是INSERT、UPDATE、DELETE还是REPLACE DML语句。

    add triggers settings selections

  2. 完成触发器设置后,向下滚动到函数部分,并使用以下代码在将新文档插入到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; 
  
};
  1. 在页面底部点击“保存”。

我们已经定义了一个数据库触发器。接下来,我们将向“movies”集合中插入一个新的文档以测试并确保触发器正在工作。

  1. 返回集群的主界面,点击“集合”标签。然后导航到“sample_mflix”数据库和“movies”集合。然后,点击“插入文档”按钮。

  1. 此“movies”集合中的文档有很多字段。为了简洁地测试此触发器,我们仅将插入一些字段。ObjectId将自动生成,因此看起来不同。然后点击“插入”。

click insert

  1. 插入文档后,在查找框中输入以下搜索条件

{title:"MongoDB FTW"}

add the search criteria

您将看到插入的新文档,其中“lastupdated”字段填充了当前时间戳。

  1. MongoDB Atlas提供的另一个出色功能是,您可以立即看到触发器执行和日志记录,而无需挖掘元数据库条目。
  2. 返回左侧导航栏上的触发器部分,并点击日志标签。然后,点击“应用”按钮刷新触发器日志。这将快速显示执行触发器的名称、状态、耗时和任何触发器控制台输出

click apply

总结

  • 触发器是一种向数据库提供自动化功能的好方法。但不要过度使用它们,因为触发器基于更改流,可能会给MongoDB集群带来压力。(更多信息请参阅此处:[https://docs.mongodb.com/realm/reference/service-limitations/#change-streams](https://docs.mongodb.com/realm/reference/service-limitations/#change-streams))。

  • 具有太多触发器的数据库可能会使事件变慢,并给操作生成过多的延迟。

  • 基于业务需求设计触发器可以防止业务逻辑渗透到您的应用程序代码中,使您的数据质量更高且更一致。

常见问题解答

什么是数据库中的触发器?

由数据库操作或事件/计划自动触发的代码。

有哪些触发器类型?

MongoDB Atlas中有三种触发器类型。一种是用于根据某些操作更新数据的数据库触发器,另一种是用于在特定时间执行一组代码的计划触发器。在Realm应用程序中,还有用于与应用程序用户身份验证相关事件的身份验证触发器类型。

数据库触发器存储在哪里?

MongoDB数据库触发器存储在组织中特定Realm应用程序的项目级别。(Atlas触发器将自动为您配置此应用程序。)

数据库触发器的示例是什么?

触发器可以用于许多用例,例如在文档编辑时更新最后更新日期,记录用户资料的最后一次登录日期,或将特定字段的更新自动更改为大写,以提供集合中的一致性。

数据库中触发器的主要目的是什么?

触发器为数据库开发者提供了一种方法,可以自动执行基于传入的DML语句或其他事件的一组代码。

我该如何应用数据库触发器?

数据库触发器可以通过数据库UI或执行代码应用于数据库集合或表。其他类型的触发器基于计划时间或认证事件。

MongoDB有触发器吗?

是的,MongoDB Atlas通过使用触发器提供了广泛的功能。有关MongoDB触发器的更多信息,请参阅文档:https://docs.atlas.mongodb.com/triggers/

准备好开始了吗?

启动新的集群或无缝迁移到MongoDB Atlas。