教程:使用Atlas Search Atlas Triggers和 在应用程序中构建反向 SearchAtlas Search
在此页面上
预计完成时间:30 分钟
您可以将Atlas App Services与Atlas Triggers和 Atlas Search结合使用,在应用程序之上构建反向搜索等功能。 反向搜索允许您存储搜索参数,然后将新文档与这些参数进行匹配。
本教程将首先讲解预构建的 Typescript 移动应用程序,其中包括一个正常运行的 React Native 应用程序(前端)及其相应的 App Services App 配置文件(后端)。此模板应用是一个基本的待办事项清单应用程序,允许用户执行各种操作来管理任务。如需了解模板应用相关详情,请参阅教程:适用于 React Native 的 Atlas Device Sync。
运行模板应用后,您将添加一项新功能,该功能会在用户创建包含特定字词或短语的任务时向您发出警报。此功能说明了如何在正式上线应用程序中实现反向搜索。 您将使用 Atlas 存储要发出警报的特定术语,然后使用 Atlas Triggers 和 Atlas Search 将新任务与这些术语进行匹配。
该功能包括:
使用RealmReact SDK 和 @realm/React 的警报框 认为:
允许您输入要予以提醒的词语。
将指定的词语存储在 Atlas 中。
带有自定义 Atlas Function 的数据库触发器:
当新任务包含您输入的词语时向您发出警报。
使用 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 教程中说明的步骤操作:
添加警报框
设置并浏览模板应用后,您可以编写一些代码来实现新的警报功能。
在此部分中,您将添加一个警报框,它允许您输入可能在特定、重要或时间敏感任务中出现的词语。
创建警报框组件
在模板应用的 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, }, });
更新主视图
在 src/ItemListView.tsx
中,将以下行添加到文件顶部,导入刚刚定义的警报框:
import {AlertBox} from './AlertBox';
然后,添加以下代码以呈现一个按钮,单击该按钮会显示警报框:
在
ItemListView
函数区块的顶部,添加一个useState()
钩子来追踪警报框视图:src/ItemListView.tsxexport 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.tsxreturn ( <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.tsxconst styles = StyleSheet.create({ ... toggleText: { flex: 1, fontSize: 16, }, alertButton: { backgroundColor: '#808080', borderRadius: 4, margin: 5, } });
在 Atlas 中存储警报词语
现在您已经为警报框创建了前端组件,请配置应用程序的后端以在 Atlas 中存储和跟踪警报词。
启用对集合的访问
创建集合后,必须赋予应用必要的权限,以便写入 todo.alerts
集合:
单击 App Services 标签页。
单击您的应用对应的图块。
在左侧导航栏中的 Data Access(数据访问)下,单击 Rules(规则)。
在
todo
数据库下,单击alerts
集合。在右侧对话框中,选择 readAndWriteAll 预设角色。
单击 Add preset role 以确认您的选择。
默认情况下,应用程序启用部署草稿。要手动部署更改,请单击 Review Draft & Deploy(查看草稿和部署),然后单击 Deploy(部署)。
写入集合
配置对 todo.alerts
集合的写入访问权限后,返回到应用程序代码。
在 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()
:
<Overlay isVisible={showAlertBox} onBackdropPress={() => setShowAlertBox(false)}> <AlertBox onSubmit={({term}) => { setShowAlertBox(false); addAlert(term); }} /> </Overlay>
运行并测试应用
您的应用现在应该允许用户一次输入一个警报词并存储在 Atlas 中。
重新生成应用并将其打开。提交一些要予以警报的词语,例如 important
或 urgent
。然后,在 todo.alerts
集合中查看您的文档,确认这些词语出现在 Atlas 中。
添加触发器
创建完警报框并设置其支持集合后,接下来创建一个 Atlas Trigger,当新任务包含警报词语之一时,它会向您发出警报。为响应变更事件,触发器可以执行应用程序和数据库逻辑。每个触发器都关联到一个 Atlas Function,后者定义触发器的行为。
在本部分中,您将创建一个数据库触发器,每当用户创建新任务时,它就会运行。在触发器的功能中,您将定义:
显示在应用程序日志中的消息。
数据库逻辑,使得触发器仅在文档包含警报一词时才返回消息。
一个 Atlas Search 查询,用于聚合其他包含相同警报词语的任务。
创建 Atlas Search 索引
要对您的数据运行 Atlas Search 查询,必须先创建一个 Atlas Search 索引来映射集合中的字段。在 Atlas UI 中,在 todo.Item
集合上创建搜索索引:
单击 Data Services(数据服务)标签页返回到 Database Deployments(数据库部署)页面。
点击同步到模板应用的部署名称,然后点击“ Search ”标签页。
要创建您的第一个 Atlas Search 索引,请单击 Create Search Index(创建搜索索引)。
在 Configuration Method(配置方法)页面中选择 Visual Editor(可视化编辑器),然后单击 Next(下一步)。
将 Index Name(索引名称)设置保留为
default
(默认值)。在 Database and Collection(数据库和集合)部分中找到
todo
数据库,然后选择Item
集合。单击 Next(下一步),在检查完索引后单击 Create Search Index(创建搜索索引)。
等待索引完成构建。
构建索引大约需要一分钟时间。构建完成后,Status(状态)列显示
Active
。
注意
如需了解 Atlas Search 索引的更多详情,请参阅创建 Atlas Search 索引。
Add a Database Trigger
要打开 App Services 用户界面中的数据库触发器配置页面:
单击 App Services 标签页,然后选择您的应用对应的图块。
在左侧导航菜单中,单击 Triggers。
单击 Add a Trigger(添加触发器),Trigger type(触发器类型)设置保留为 Database(数据库)不变。
将触发器命名为
sendAlerts
。配置触发器仅侦听插入到
todo.Item
集合中的新任务文档:对于 Cluster Name,选择同步到模板应用的部署。
对于 Database Name(数据库名称)和 Collection Name(集合名称),选择
todo
数据库和Item
集合。对于 Operation Type(操作类型),选择 Insert(插入)。
启用 Full Document(完整文档)以将每个新报告文档包含在传递给触发器函数的变更事件中。
定义 Atlas Function
导航至触发器配置页面的 Function(函数)部分,并从下拉菜单中选择 + New Function(新增函数)。然后,定义触发器的函数:
将函数命名为
triggers/sendAlerts
。将以下代码复制到函数主体中:
functions/triggers/sendAlerts.jsexports = 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
集合中包含相同警报词的其他任务文档。查询使用:注意
如要了解更多信息,请参阅创建和运行 Atlas Search 查询。
完成后,单击 Save(保存)并部署触发器。
运行并测试应用
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."}]" ]
接下来的步骤
扩展警报功能以调用外部服务,该服务可以向您发送短信或电子邮件,而不仅仅是日志记录。如需了解详情,请参阅《外部依赖》。
阅读 Atlas Search 文档,了解有关索引和查询 Atlas 数据的更多信息。
定义自定义 HTTPS 端点来创建应用特定的 API 路由或 Webhook。