Node-REDでMongoDB

ここではHeroku上のNode-REDでのMongoDBの扱い方について説明する。HerokuでのNode-RED環境構築や、HerokuのMongoDBアドオンの使い方については前記事を参照。

MongoDBのノード

Node-REDで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)を指定する

f:id:licheng:20190218090808p:plain

データベースサーバーの設定

  • パレットからmongodb2ノードをフローに置く
  • ノードをクリックして設定を開く
  • 「Server」の鉛筆マークをクリックし、MongoDBサーバーの設定を入力して「更新」
    (前記事の要メモ事項を参照)
    • URI」: mongodb://ドメイン名:ポート番号/データベース名
    • 「Name」: 区別のために任意の名前をつける
    • 「Username」: ユーザー名
    • 「Password」: パスワード

f:id:licheng:20190218091942p:plain

ノードの設定

  • 「Service」は「External seivice」を選択
  • 「Server」は上記で設定したデータベースサーバーの名前を選択
  • 「Collection」は処理の対象とするMongoDBのコレクション名を指定
    ※ 空欄にして msg.collection で指定することもできる
  • 「Operation」で機能(API)を選択する
    ※ Dynamic (msg.operation)」を選択して msg.operation で指定することもできる

f:id:licheng:20190218091955p:plain

使い方のサンプル

いくつかの機能(API)の使い方のサンプルを以下に示す。下記JSONファイルの内容をコピーして、Node-REDの右上メニューの「読み込み」>「クリップボード」で貼り付け。データベースの設定は、各自の環境に合わせて前述のように設定のこと。

f:id:licheng:20190217213844p:plain:w800

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」は各ドキュメントが必ずユニークな値を持つキーであり、ドキュメント作成時に自動で生成される。
f:id:licheng:20190217212720p:plain

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;