对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

教程:从触发器调用第三方API

在本教程中,您将创建一个数据库触发器。将文档插入集合时,触发器会调用第三方API 。 Trigger 函数将官方 AWS 软件开发工具包 (SDK) 添加为外部依赖项。然后,该函数使用 SDK 将插入的文档作为扩展JSON对象写入S3 存储桶。

本教程中的 AWS S3示例说明了一种适用于任何具有 Node.js 库的第三方服务的模式:

  • 将服务的npm包添加为外部依赖项。

  • 将任何所需的凭证存储为密钥,并从函数的值中引用它们。

  • 在函数中导入包含 require() 的包,并使用您存储的凭证进行调用。

若要完成本教程,必须具备:

创建以下值和密钥来存储您的 AWS凭证:

  • AwsAccessKeyId:包含 AWS访问权限密钥ID的值。

  • AwsSecretAccessKeySecret:包含 AWS 秘密访问权限密钥的密钥。

  • AwsSecretAccessKey:链接到密钥的值。这样,您就可以访问权限函数中的秘密访问权限密钥,同时仍将其作为密钥安全存储。

1

在 Atlas 中,前往 Triggers 页面。

  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。

  2. 如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。

  3. 在侧边栏中,单击 Streaming Data 标题下的 Triggers。

会显示触发器页面。

  1. 单击 View All Apps 按钮。

  2. 单击要在其中创建触发器的应用。

  3. 在侧边栏中,单击 Build 标题下的 Values。

2
  1. 单击 Create a Value(连接)。

  2. 输入 AwsAccessKeyId 作为 Value Name。

  3. 选择 Value 类型。

  4. 选择 Custom Content 选项并输入您的 AWS访问权限密钥ID。

    注意

    您必须以带引号的字符串值形式输入访问权限密钥ID ("<accessKeyId>")。

  5. 单击 Save Draft(连接)。

3

注意

无法直接访问密钥值,因此您必须创建链接到该密钥的第二个值。

  1. 单击 Create a Value(连接)。

  2. 输入 AwsSecretAccessKey 作为 Value Name。

  3. 选择 Value 类型。

  4. 选择 Link to Secret 选项。

  5. 输入 AwsSecretAccessKeySecret 并单击 Create "AwsSecretAccessKeySecret" 以命名密钥。

    将您的 AWS 秘密访问权限密钥粘贴到密钥名称下方显示的字段中。

  6. 单击 Save Draft 以创建密钥和值。

创建一个数据库触发器,在插入文档时调用新函数。您可以添加 aws-sdk 依赖项,并以相同的形式定义函数代码。

1

在 Atlas 中,前往 Triggers 页面。

  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。

  2. 如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。

  3. 在侧边栏中,单击 Streaming Data 标题下的 Triggers。

会显示触发器页面。

2
  1. 单击 Add Trigger 打开触发器配置页面。

  2. 选择 Database 触发器类型,然后使用以下值配置触发器:

    设置
    值
    Trigger Name

    WriteDocumentToS3Trigger

    Watch Against

    Collection

    Cluster Name

    测试集群的名称

    Database Name

    测试数据库的名称

    Collection Name

    测试集合的名称

    Operation Type

    仅选择 Insert。

    Event Type

    Function

  3. 在 Function 部分,选择 + New Function。

3
  1. 在 Function 部分中,单击 Add Dependency。

  2. 在 Add Dependency窗口中,输入 aws-sdk 作为 Define a Package Name 并将 Package Version 留空以使用最新版本。

  3. 单击Add添加包。

4

将 YOUR_AWS_REGION 和 YOUR_S3_BUCKET_NAME 替换为您自己的 AWS 区域以及 AWS 管理控制台中的完整存储桶名称。

1/*
2 * Write a newly-inserted document to an S3 bucket as an Extended JSON object.
3 */
4exports = async function writeDocumentToS3(changeEvent) {
5 const { fullDocument } = changeEvent;
6
7 // require calls must be in the exports function
8 const S3 = require("aws-sdk/clients/s3");
9 const s3 = new S3({
10 accessKeyId: context.values.get("AwsAccessKeyId"),
11 secretAccessKey: context.values.get("AwsSecretAccessKey"),
12 region: "YOUR_AWS_REGION",
13 });
14
15 const key = `inserted-documents/${fullDocument._id.toString()}.json`;
16
17 // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property
18 await s3.putObject({
19 Bucket: "YOUR_S3_BUCKET_NAME",
20 Key: key,
21 Body: EJSON.stringify(fullDocument),
22 ContentType: "application/json",
23 }).promise();
24
25 return `Wrote document ${fullDocument._id} to ${key}`;
26};

每次插入文档时,该函数都会执行以下操作:

  • 从变更事件的 fullDocument字段读取插入的文档。

  • 创建一个 S3客户端,使用存储在值中的 AWS凭证进行身份验证。

  • 将文档作为 <_id>.json 写入存储桶的 inserted-documents/ 前缀。

注意

该函数使用文档的 _id 作为 S3对象键的一部分。如果您的文档使用 ObjectId 以外的 _id 类型,则密钥可能不是您所期望的。

5

重要

如果您的应用启用了部署草稿,请单击 Review & Deploy 以部署值、密钥、依赖项、函数和触发器。在部署它们之前,触发器不会运行,下一步也会失败。

将测试文档插入触发器监视的集合中。确认相应的扩展JSON对象出现在您的 S3 存储桶中的 inserted-documents/ 前缀下。

2

以下示例将一个文档插入到测试集合中。将 YOUR_DATABASE_NAME 和 YOUR_COLLECTION_NAME 替换为您在创建触发器时输入的数据库和集合。

// Replace YOUR_DATABASE_NAME and YOUR_COLLECTION_NAME with the
// database and collection that the Trigger watches.
use YOUR_DATABASE_NAME
db.YOUR_COLLECTION_NAME.insertOne({
tutorialTest: "atlas-trigger-s3",
createdAt: new Date()
})

记下输出中的 insertedId 值。函数使用该值作为 S3对象的名称。

3

在 AWS 管理控制台中,打开 S3 存储桶并导航到 inserted-documents/ 前缀。此时会出现一个名为 <insertedId>.json 的对象,其中 <insertedId> 是上一步中的 insertedId 值。