fc2ブログ

MongoDBのシェルでトリガーを実装する

MongoDBにはトリガーがありません。
そこで、OpLogを使って、トリガーの代替を実装します。

var option = DBQuery.Option.awaitData | DBQuery.Option.tailable;
var cursor = connect( 'local' ).oplog.rs.find().addOption( option );
cursor.skip( cursor.count() );

var stop = false;
while ( !stop ) {
var now = new Date();
while ( cursor.hasNext() ) {
var op = cursor.next();
if ( op.ns === 'test.stop' ) {
stop = true;
break;
}
do_something( op );
}
// Safety Trap for busy loop.
if ( (new Date()) - now < 100 ) {
break;
}
}



  • DBQuery.Option.awaitData は、カーソルが空になった後、5秒待つようです。
  • DBQuery.Option.noTimeout で無限に待たせたいのですが、このオプションの効果が分かりませんでした。
  • [停止方法] testデータベースのstopコレクションにinsertかupdateすると、外側の無限ループを抜けます。


[応用]
MongoDBでは「非正規化」のサポートがありませんね。
このトリガー機能を使って、「非正規化」を実装してみました。
GitHub/MongoTrigger
スポンサーサイト



コメントの投稿

非公開コメント

検索フォーム
RSSリンクの表示
リンク
exabugsをフォローしましょう