チュートリアル:Atlas Search Atlas Triggersと を使用したアプリケーションへのリバース のビルドAtlas Search
項目一覧
完了までの推定時間: 30 分
Atlas App ServicesをAtlas Triggersと Atlas Searchと組み合わせて使用すると、アプリケーション上で逆方向検索などの機能を構築できます。 逆検索では、検索パラメータを保存し、新しいドキュメントをそれらのパラメータに照合できます。
このチュートリアルでは、動作するTypescript React Nativeアプリケーション(フロントエンド)とそれに対応する 構成ファイル(バックエンド)を含む事前に構築された モバイルApp Services App アプリケーションから開始します。このテンプレート アプリは、ユーザーがタスクを管理するためにさまざまなことを行うことができる To Do リストの基本アプリケーションです。 テンプレート アプリの詳細については、「チュートリアル: React Native の Atlas Device Sync 」を参照してください。
テンプレート アプリを実行したら、特定の単語またはフレーズを含むタスクをユーザーが作成したときにアラートを送信する新機能を追加します。 この機能では、本番アプリケーションに逆方向検索を実装する方法が示されています。 Atlasを使用してアラートが発行される特定のタームを保存し、 Atlas TriggersとAtlas Searchを使用して、新しいタスクをそれらのタームと照合します。
この機能には、次のものが含まれます。
RealmReactSDK と @realm/React を使用するアラート ボックス 以下の条件に一致するもの。
アラートを発行するタームを入力できるようにします。
指定したタームを Atlas に保存します。
次のカスタム を持つAtlas Function データベースtrigger 。
新しいタスクに入力したタームが含まれている場合は、 アラートが送信されます。
たとえば、ユーザーが時間区別するタスクをいつ送信するかを確認したい場合は、「 urgent
などのタームを入力します。 その後、 Urgent: complete this task
などのタームを含むタスクをユーザーが追加すると、すぐにアラートが送信されます。
前提条件
始める前に:
React Native 開発にはローカル環境を設定する必要があります。 詳細な手順については、「 開発環境を設定するReact NativeDocs 」を参照してください。 の .
このチュートリアルは、テンプレート アプリから始めます。 テンプレート アプリを作成するには、 Atlas アカウント、 API キー、 App Services CLI が必要です。
Atlas アカウントの作成の詳細については、「 Atlas の使用開始」ドキュメントを参照してください。 このチュートリアルでは、無料階層クラスターを持つ Atlas アカウントが必要です。
ログインする MongoDB Cloud アカウントの Atlas API キーも必要です。 App Services CLI を使用してテンプレート アプリを作成するには、プロジェクト オーナーである必要があります。
App Services CLI のインストールについて詳しくは、「 App Services CLI のインストール」を参照してください。 インストール後、Atlas プロジェクトの API キーを使用して「 login 」コマンドを実行します。
Atlas Search クエリを実行するには、Atlas クラスターで MongoDB バージョン 4.2 以降が実行されていることを確認してください。
新しいテンプレート アプリの作成
このチュートリアルは、 react-native.todo.flex
という名前の React Native SDK Flexible Sync テンプレート アプリを基本にして作成されており、 デフォルトのアプリから始めて、新しい機能について説明しています。
テンプレート アプリをコンピューター上で起動して実行するには、React Native チュートリアルに記載されている手順に従います。
アラート ボックスの追加
テンプレート アプリを設定して調べたら、次は新しいアラート機能を実装するためのコードを記述します。
このセクションでは、特定の重要なタスクまたは時間に依存するタスクに表示される可能性のあるタームを入力できるアラート ボックスを追加します。
アラート ボックス コンポーネントの作成
テンプレート アプリのsrc/
ディレクトリに新しいAlertBox.tsx
ファイルを作成し、次のコードを追加します。 このファイルには、アラートを発行するタームを入力できる UI フォームが含まれています。
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] タブをクリックします。
アプリのタイルをクリックします。
左側のナビゲーションで [ Rules Data Access ] の下の [] をクリックします。
todo
データベースで、alerts
コレクションをクリックします。右側のダイアログボックスで、 readAndWriteAll事前設定されたロールを選択します。
[Add preset role] をクリックして選択を確定します。
デフォルトでは、アプリケーションは配置案を有効にします。 変更を手動で配置するには、 Review Draft & Deployをクリックし、 Deployをクリックします。
コレクションへの書込み (write)
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()
関数は string 入力を受け取り、 React Native SDKを使用して Atlas に接続し、指定されたアラート タームをドキュメントとしてコレクションに挿入します。
次に、ユーザーがアプリでアラートタームを送信したときにaddAlert()
を呼び出すように、アラートボックス送信ハンドラーに次の行を追加します。
<Overlay isVisible={showAlertBox} onBackdropPress={() => setShowAlertBox(false)}> <AlertBox onSubmit={({term}) => { setShowAlertBox(false); addAlert(term); }} /> </Overlay>
アプリを実行・テストする
これで、ユーザーが一度に 1 つずつアラート タームを入力して Atlas に保存できるようになります。
アプリを再ビルドして開きます。 important
やurgent
など、アラートが発行されるいくつかのタームを入力します。 次に、 todo.alerts
コレクション内のドキュメントを表示して、タームが Atlas に表示されることを確認します。
trigger を追加する
アラート ボックスを作成し、そのバッキング コレクションを設定したので、新しいタスクにアラート タームの 1 つが含まれているときにアラートを発行するAtlas triggerを作成します。 trigger は、変更イベントに応答してアプリケーションとデータベース ロジックを実行できます。 各 trigger は、trigger の動作を定義するAtlas Functionにリンクします。
このセクションでは、ユーザーが新しいタスクを作成するたびに実行されるデータベースtriggerを作成します。 trigger の関数では、以下を定義します。
アプリケーション ログに表示されるメッセージ。
データベース ロジック。ドキュメントに アラート用語が含まれている場合にのみ trigger がメッセージを返すようにします。
同じアラート タームを含む他のタスクを集計する 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 ] をクリックします。
インデックスの作成が完了するまで待ちます。
インデックスの構築には約 1 分かかります。 作成が完了すると、 Status列には
Active
と表示されます。
注意
Atlas Search インデックスの詳細については、「 Atlas Search インデックスの作成 」を参照してください。
Add a Database Trigger
App Services UI でデータベースtrigger設定ページを開くには、次の手順に従います。
[ App Services ] タブをクリックし、アプリのタイルを選択します。
左側のナビゲーション メニューで、[ Triggers ] をクリックします。
Add a Triggerをクリックし、 Trigger typeをDatabaseに設定したままにします。
trigger を
sendAlerts
と名付けます。todo.Item
コレクションに挿入された新しいタスク ドキュメントのみをリッスンするように trigger を設定します。Cluster Nameには、テンプレート アプリに同期されている配置を選択します。
Database NameとCollection Nameには、
todo
データベースとItem
コレクションを選択します。Operation TypeでInsertを選択します。
新しい各レポート ドキュメントを trigger 関数に渡される変更イベントに含めるには、 Full Documentを有効にします。
Atlas Functionの定義
trigger 構成ページの [ Function ] セクションに移動し、ドロップダウン メニューから [ + New Function ] を選択します。 次に、trigger の関数を定義します。
関数を
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); } } } }; この JavaScript 関数は、
todo.alerts
コレクションに保存されているタームを含むタスクをユーザーが入力したときに、アプリケーション ログにメッセージを返します。この関数には、同じアラートタームを含む
todo.Item
コレクション内の他のタスク ドキュメントを検索するための Atlas Search クエリも含まれています。 クエリでは以下を使用します。コレクションをクエリするための$searchパイプライン ステージ。
次の複合演算子句。
出力を5の結果に制限する$limitステージ。
$projectステージでは、
summary
を除くすべてのフィールドが除外されます。
注意
それが完了したら、[ Save ] をクリックして trigger を配置します。
アプリを実行・テストする
Atlas は、ユーザーがアラート期間を含むタスクをアプリ内で作成したときにアラートを発行するように設定されるようになりました。
アプリを再構築して実行し、すべてが動作することを確認します。 以前に入力したアラート タームを含むタスクをいくつか入力します。 次に、ログを表示して、trigger からの出力を確認します。 ドロップダウン メニューからTriggersタイプを選択すると、 trigger ログをフィルタリングできます。
たとえば、アラート タームの 1 つが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 データのインデックス作成とクエリの詳細については、 Atlas Search のドキュメントをお読みください。
カスタムHTTPS endpointsを定義して、アプリ固有のAPIルートまたは Webhook を作成します。
注意
フィードバックの共有
ではどのようにGoしましたか。 ページ右下にあるRate this pageウィジェットを使用して、有効性を評価します。 またはGithub リポジトリ に問題を報告する 問題が発生した場合は、。