Docs 菜单
Docs 主页
/ /
Atlas App Services

教程:使用Atlas Search Atlas Triggers和 在应用程序中构建反向 SearchAtlas Search

在此页面上

  • 先决条件
  • 创建新模板应用
  • 添加警报框
  • 创建警报框组件
  • 更新主视图
  • 在 Atlas 中存储警报词语
  • 创建新集合
  • 启用对集合的访问
  • 写入集合
  • 运行并测试应用
  • 添加触发器
  • 创建 Atlas Search 索引
  • Add a Database Trigger
  • 定义 Atlas Function
  • 运行并测试应用
  • 接下来的步骤

预计完成时间:30 分钟

您可以将Atlas App Services与Atlas Triggers Atlas Search结合使用,在应用程序之上构建反向搜索等功能。 反向搜索允许您存储搜索参数,然后将新文档与这些参数进行匹配。

本教程将首先讲解预构建的 Typescript 移动应用程序,其中包括一个正常运行的 React Native 应用程序(前端)及其相应的 App Services App 配置文件(后端)。此模板应用是一个基本的待办事项清单应用程序,允许用户执行各种操作来管理任务。如需了解模板应用相关详情,请参阅教程:适用于 React Native 的 Atlas Device Sync。

运行模板应用后,您将添加一项新功能,该功能会在用户创建包含特定字词或短语的任务时向您发出警报。此功能说明了如何在正式上线应用程序中实现反向搜索。 您将使用 Atlas 存储要发出警报的特定术语,然后使用 Atlas Triggers 和 Atlas Search 将新任务与这些术语进行匹配。

该功能包括:

例如,如果您想知道用户何时提交对时间敏感的任务,则可以输入 urgent等术语。然后,当用户添加包含该术语的任务(例如Urgent: complete this task时,您会立即收到警报。

开始之前:

  • 必须为 React Native 开发设置好本地环境。有关详细说明,请参阅 React Native 文档中的设置开发环境

  • 本教程从“模板应用程序”开始。创建“模板应用程序”需要 Atlas 帐号、API 密钥和 App Services CLI。

    • 如需了解有关创建 Atlas 帐户的更多信息,请参阅 Atlas 入门文档。在本教程中,您需要一个带有免费层级集群的 Atlas 帐户。

    • 您还需要一个用于登录的 MongoDB Cloud 账户的 Atlas API 密钥。您必须是项目所有者才能使用 App Services CLI 创建模板应用。

    • 要了解有关安装 App Services CLI 的更多信息,请参阅安装 App Services CLI 。安装后,使用 Atlas 项目的 API 密钥运行登录命令。

  • 要运行 Atlas Search 查询,请确保您的 Atlas 集群运行 MongoDB 版本 4.2 或更高版本。

本教程基于名为 react-native.todo.flex 的 React Native SDK Flexible Sync 模板应用。先使用默认应用,然后在其上构建新功能。

要在计算机上启动并运行模板应用,请按照 React Native 教程中说明的步骤操作:

  1. 从模板应用开始

  2. 设置模板应用程序

  3. 了解模板应用

设置并浏览模板应用后,您可以编写一些代码来实现新的警报功能。

在此部分中,您将添加一个警报框,它允许您输入可能在特定、重要或时间敏感任务中出现的词语。

1

在模板应用的 src/ 目录中,创建一个新的 AlertBox.tsx 文件并添加以下代码。此文件包含用户界面表单,让您可以输入要触发警报的词语。

src/AlertBox.tsx
import React, {useState} from 'react';
import {StyleSheet, View} from 'react-native';
import {Text, Input, Button} from 'react-native-elements';
import {COLORS} from './Colors';
type Props = {
onSubmit: ({term}: {term: string}) => void;
};
export function AlertBox(props: Props): React.ReactElement<Props> {
const {onSubmit} = props;
const [term, setTerm] = useState('');
return (
<View style={styles.modalWrapper}>
<Text h4 style={styles.addItemTitle}>
Add Alert Term
</Text>
<Input
placeholder="Enter term"
onChangeText={(text: string) => setTerm(text)}
autoCompleteType={undefined}
/>
<Button
title="Submit"
buttonStyle={styles.saveButton}
onPress={() => onSubmit({term})}
/>
</View>
);
}
const styles = StyleSheet.create({
modalWrapper: {
width: 300,
minHeight: 200,
borderRadius: 4,
alignItems: 'center',
},
addItemTitle: {
margin: 20,
},
saveButton: {
width: 280,
backgroundColor: COLORS.primary,
},
});
2

src/ItemListView.tsx 中,将以下行添加到文件顶部,导入刚刚定义的警报框:

import {AlertBox} from './AlertBox';

然后,添加以下代码以呈现一个按钮,单击该按钮会显示警报框:

  • ItemListView 函数区块的顶部,添加一个 useState() 钩子来追踪警报框视图:

    src/ItemListView.tsx
    export function ItemListView() {
    const realm = useRealm();
    const items = useQuery(Item).sorted('_id');
    const user = useUser();
    const [showNewItemOverlay, setShowNewItemOverlay] = useState(false);
    const [showAlertBox, setShowAlertBox] = useState(false);
  • 在主视图中的 Add To-Do 按钮后面,添加一个用于切换警报框覆盖的 Alerts 按钮:

    src/ItemListView.tsx
    return (
    <SafeAreaProvider>
    <View style={styles.viewWrapper}>
    ...
    <Button
    title="Add To-Do"
    buttonStyle={styles.addToDoButton}
    onPress={() => setShowNewItemOverlay(true)}
    icon={
    <Icon
    type="material"
    name={'playlist-add'}
    style={styles.showCompletedIcon}
    color="#fff"
    tvParallaxProperties={undefined}
    />
    }
    />
    <Button
    title="Alerts"
    buttonStyle={styles.alertButton}
    onPress={() => setShowAlertBox(true)}
    icon={
    <Icon
    type="material"
    name={'add-alert'}
    style={styles.showCompletedIcon}
    color="#fff"
    tvParallaxProperties={undefined}
    />
    }
    />
    <Overlay
    isVisible={showAlertBox}
    onBackdropPress={() => setShowAlertBox(false)}>
    <AlertBox
    onSubmit={({term}) => {
    setShowAlertBox(false);
    }}
    />
    </Overlay>
    </View>
    </SafeAreaProvider>
    );
  • 要更改按钮的大小和颜色,请在文件底部的 styles 区块中添加以下几行:

    src/ItemListView.tsx
    const styles = StyleSheet.create({
    ...
    toggleText: {
    flex: 1,
    fontSize: 16,
    },
    alertButton: {
    backgroundColor: '#808080',
    borderRadius: 4,
    margin: 5,
    }
    });

现在您已经为警报框创建了前端组件,请配置应用程序的后端以在 Atlas 中存储和跟踪警报词。

1

在 Atlas 用户界面中,创建一个集合来存储用户在应用中输入的词语:

  1. 如果尚未进入 Database Deployments页面,请单击Data Services标签页。

  2. 对于同步到模板应用的部署,请单击 Browse Collections(浏览集合)。

  3. 在左侧导航栏中,单击 todo 数据库旁边的 + 图标以添加新集合。

  4. 将集合命名为 alerts,然后单击 Create(创建)以保存集合。

2

创建集合后,必须赋予应用必要的权限,以便写入 todo.alerts 集合:

  1. 单击 App Services 标签页。

  2. 单击您的应用对应的图块。

  3. 在左侧导航栏中的 Data Access(数据访问)下,单击 Rules(规则)。

  4. todo 数据库下,单击 alerts 集合。

  5. 在右侧对话框中,选择 readAndWriteAll 预设角色。

  6. 单击 Add preset role 以确认您的选择。

  7. 默认情况下,应用程序启用部署草稿。要手动部署更改,请单击 Review Draft & Deploy(查看草稿和部署),然后单击 Deploy(部署)。

3

配置对 todo.alerts 集合的写入访问权限后,返回到应用程序代码。

src/ItemListView.tsx 中,将以下行添加到函数区块的顶部,以创建写入集合的辅助函数:

src/ItemListView.tsx
export function ItemListView() {
const realm = useRealm();
const items = useQuery(Item).sorted('_id');
const user = useUser();
// addAlert() takes a string input and inserts it as a document in the todo.alerts collection
const addAlert = async (text: string) => {
const mongodb = user?.mongoClient("mongodb-atlas");
const alertTerms = mongodb?.db("todo").collection("alerts");
await alertTerms?.insertOne({ term: text.toLowerCase() });
};

addAlert() 函数接受字符串输入,使用 React Native SDK 连接到 Atlas,并将指定的警报词语作为文档插入集合中。

然后,将以下行添加到警报框提交处理程序,以便在用户于应用中提交警报词时调用 addAlert()

src/ItemListView.tsx
<Overlay
isVisible={showAlertBox}
onBackdropPress={() => setShowAlertBox(false)}>
<AlertBox
onSubmit={({term}) => {
setShowAlertBox(false);
addAlert(term);
}}
/>
</Overlay>
4

您的应用现在应该允许用户一次输入一个警报词并存储在 Atlas 中。

重新生成应用并将其打开。提交一些要予以警报的词语,例如 importanturgent。然后,在 todo.alerts 集合中查看您的文档,确认这些词语出现在 Atlas 中。

创建完警报框并设置其支持集合后,接下来创建一个 Atlas Trigger,当新任务包含警报词语之一时,它会向您发出警报。为响应变更事件,触发器可以执行应用程序和数据库逻辑。每个触发器都关联到一个 Atlas Function,后者定义触发器的行为。

在本部分中,您将创建一个数据库触发器,每当用户创建新任务时,它就会运行。在触发器的功能中,您将定义:

  • 显示在应用程序日志中的消息。

  • 数据库逻辑,使得触发器仅在文档包含警报一词时才返回消息。

  • 一个 Atlas Search 查询,用于聚合其他包含相同警报词语的任务。

1

要对您的数据运行 Atlas Search 查询,必须先创建一个 Atlas Search 索引来映射集合中的字段。在 Atlas UI 中,在 todo.Item 集合上创建搜索索引:

  1. 单击 Data Services(数据服务)标签页返回到 Database Deployments(数据库部署)页面。

  2. 点击同步到模板应用的部署名称,然后点击“ Search ”标签页。

  3. 要创建您的第一个 Atlas Search 索引,请单击 Create Search Index(创建搜索索引)。

  4. Configuration Method(配置方法)页面中选择 Visual Editor(可视化编辑器),然后单击 Next(下一步)。

  5. Index Name(索引名称)设置保留为 default(默认值)。

  6. Database and Collection(数据库和集合)部分中找到 todo 数据库,然后选择 Item 集合。

  7. 单击 Next(下一步),在检查完索引后单击 Create Search Index(创建搜索索引)。

  8. 等待索引完成构建。

    构建索引大约需要一分钟时间。构建完成后,Status(状态)列显示 Active

注意

如需了解 Atlas Search 索引的更多详情,请参阅创建 Atlas Search 索引

2

要打开 App Services 用户界面中的数据库触发器配置页面:

  1. 单击 App Services 标签页,然后选择您的应用对应的图块。

  2. 在左侧导航菜单中,单击 Triggers

  3. 单击 Add a Trigger(添加触发器),Trigger type(触发器类型)设置保留为 Database(数据库)不变。

  4. 将触发器命名为 sendAlerts

  5. 配置触发器仅侦听插入到 todo.Item 集合中的新任务文档:

    • 对于 Cluster Name,选择同步到模板应用的部署。

    • 对于 Database Name(数据库名称)和 Collection Name(集合名称),选择 todo 数据库和 Item 集合。

    • 对于 Operation Type(操作类型),选择 Insert(插入)。

    • 启用 Full Document(完整文档)以将每个新报告文档包含在传递给触发器函数的变更事件中。

3

导航至触发器配置页面的 Function(函数)部分,并从下拉菜单中选择 + New Function(新增函数)。然后,定义触发器的函数:

  1. 将函数命名为 triggers/sendAlerts

  2. 将以下代码复制到函数主体中:

    functions/triggers/sendAlerts.js
    exports = async function(changeEvent) {
    // Read the summary field from the latest inserted document
    const fullDocument = changeEvent.fullDocument;
    const summary = fullDocument.summary;
    // Connect to your Atlas deployment
    const mongodb = context.services.get("mongodb-atlas");
    // Read task and alert data from collections in the todo database
    const tasks = mongodb.db("todo").collection("Item");
    const alerts = mongodb.db("todo").collection("alerts");
    const terms = await alerts.distinct("term");
    // Check if the task summary matches any of the terms in the alerts collection
    for (let i = 0; i < terms.length ; i++) {
    if (summary.toLowerCase().includes(terms[i])) {
    console.log("The following task has been added to a to-do list: " + summary +
    ". You've been alerted because it contains the term, " + terms[i] + ".");
    // Aggregates any tasks that also contain the term by using an Atlas Search query
    const query = await tasks
    .aggregate([
    {
    $search: {
    compound: {
    must: [{
    phrase: {
    query: terms[i],
    path: "summary",
    },
    }],
    mustNot: [{
    equals: {
    path: "isComplete",
    value: true,
    },
    }],
    },
    },
    },
    {
    $limit: 5,
    },
    {
    $project: {
    _id: 0,
    summary: 1,
    },
    },
    ])
    .toArray();
    relatedTerms = JSON.stringify(query);
    if (relatedTerms != '[]') {
    console.log("Related incomplete tasks: " + relatedTerms);
    }
    }
    }
    };

    当用户输入的任务包含 todo.alerts 集合中存储的词语时,此 JavaScript 函数会在您的应用程序日志中返回一条消息。

    该函数还包括 Atlas Search 查询,用于查找 todo.Item 集合中包含相同警报词的其他任务文档。查询使用:

    • $search 管道阶段,以查询集合。

    • 以下复合操作符子句:

      • must 子句和 phrase 操作符,查询任何带有 summary 且其中包含警报词的任务。

      • mustNot 子句和 equals 操作符,排除已完成的任务。

    • $limit 阶段将输出限制为 5 个结果。

    • $project 阶段,排除 summary 之外的所有字段。

    注意

    如要了解更多信息,请参阅创建和运行 Atlas Search 查询

  3. 完成后,单击 Save(保存)并部署触发器。

4

Atlas 现在已设置为当用户在应用中创建包含警报词的任务时向您发出警报。

重新构建并运行应用,以确保一切正常。输入几个任务,这些任务包含您之前输入的警报词语。然后查看日志,以查看触发器的输出。您可以从下拉菜单中选择 Triggers(触发器)类型来筛选触发器日志

例如,如果您的警报词之一是 important,则新任务的日志输出可能类似于以下所示:

Logs:
[
"The following task has been added to a to-do list: Complete important tutorial.
You've been alerted because it contains the term, important.",
"Related incomplete tasks: [
{"summary": "Important: Create template app"},
{"summary": "Add important tasks"},
{"summary": "Make sure to read the documentation. This is important."}]"
]

注意

分享反馈

怎么样?使用页面右下角的 Rate this page 小组件来评价其有效性。如果有任何问题,也可以在 Github 存储库 上提交问题。

来年

什么是 Atlas App Services?