ここではHeroku上のNode-REDでのMongoDBの扱い方について説明する。HerokuでのNode-RED環境構築や、HerokuのMongoDBアドオンの使い方については前記事を参照。
MongoDBのノード
Node-REDでMongoDBを扱うためのノードはいくつかある。
- node-red-contrib-mongodb : シンプルなMongoDBノード
- node-red-contrib-mongodb2 : MongoDB Node.js 2.x driver対応版
- node-red-contrib-mongodb3 : MongoDB Node.js 3.x driver対応版
- node-red-node-mongodb : これもシンプルなMongoDBノード
このほか、Bluemix用のnode-red-bluemix-nodesにもMongoDBを扱うノードが含まれる。
ここでは比較的多機能なnode-red-contrib-mongodb2を使ってみる。node-red-contrib-mongodb3もAPIのバージョンが異なるもののほぼ使い方は同じと思われる。
パレットにmongodb2ノードを追加
- Node-RED画面右上のメニューの「パレットの管理」を開く
- 「ノードの追加」タブで「node-red-contrib-mongodb2」を検索し「ノードを追加」
- 左側ペインのノードパレットにmongodb2のノードが追加される
- ノードは1種類しかない。後述するようにノードの設定またはmsgで機能(API)を指定する
データベースサーバーの設定
- パレットからmongodb2ノードをフローに置く
- ノードをクリックして設定を開く
- 「Server」の鉛筆マークをクリックし、MongoDBサーバーの設定を入力して「更新」
(前記事の要メモ事項を参照)
ノードの設定
- 「Service」は「External seivice」を選択
- 「Server」は上記で設定したデータベースサーバーの名前を選択
- 「Collection」は処理の対象とするMongoDBのコレクション名を指定
※ 空欄にして msg.collection で指定することもできる - 「Operation」で機能(API)を選択する
※ Dynamic (msg.operation)」を選択して msg.operation で指定することもできる
使い方のサンプル
いくつかの機能(API)の使い方のサンプルを以下に示す。下記JSONファイルの内容をコピーして、Node-REDの右上メニューの「読み込み」>「クリップボード」で貼り付け。データベースの設定は、各自の環境に合わせて前述のように設定のこと。
insert (挿入)
- mongodb2ノードの「Operation」を「insert」に設定する。
- ノードの入力の msg.payload に挿入したいドキュメントをオブジェクト形式またはJSON形式で格納する。
- このサンプルでは https://アプリ名.herokuapp.com/insert にブラウザでアクセスすると insert が実行され、結果がデバッグメッセージとブラウザに表示される。
// 例 // msg.payload = { 'name' : 'Alexander', 'age' : 32 }; // JSON形式 msg.payload = { name : 'Alexander', age : 32 }; // オブジェクト形式 return msg;
以下のAPIの動作確認のため、データベースに下記のようなドキュメントを作成しておく。「_id」は各ドキュメントが必ずユニークな値を持つキーであり、ドキュメント作成時に自動で生成される。
find (検索)
- mongodb2ノードの「Operation」を「find.toArray」に設定する。
- ノードの入力の msg.payload に検索条件を格納する。下記の例では age が 60未満のドキュメントを検索する。
- ノードの出力の msg.payload に見つかったドキュメントの配列が格納される。
- このサンプルでは https://アプリ名.herokuapp.com/findにブラウザでアクセスすると find.toArray が実行され、結果がデバッグメッセージとブラウザに表示される。
// 例 msg.payload = { age: { $lt: 60 } }; return msg;
findOne (一つだけ検索)
- mongodb2ノードの「Operation」を「findOne」に設定する。
- ノードの入力の msg.payload に検索条件を格納する。下記の例では name が Alexanderであるドキュメントを検索する。
- ノードの出力の msg.payload に見つかったドキュメントが格納される。
- このサンプルでは https://アプリ名.herokuapp.com/findOneにブラウザでアクセスすると findOne が実行され、結果がデバッグメッセージとブラウザに表示される。
// 例 msg.payload = { name : 'Alexander' }; return msg;
findOneAndUpdate (一つだけ検索し更新)
- mongodb2ノードの「Operation」を「findOneAndUpdate」に設定する
- ノードの入力の msg.payload に検索条件と更新値のペアを配列で格納する。下記の例では name が Alexanderであるドキュメントを検索し、age を 33 に更新する。
- このサンプルでは https://アプリ名.herokuapp.com/updateにブラウザでアクセスすると findOneAndUpdate が実行され、結果がデバッグメッセージとブラウザに表示される。
// 例 msg.payload = [ { name : 'Alexander'}, { name : 'Alexander', age : 33 } ]; return msg;