1. ホーム
  2. mongodb

[解決済み】MongoDB コレクションの変更をリッスンする方法は?

2022-04-10 17:44:58

質問

MongoDBをデータストアとして、ある種のバックグラウンド・ジョブ・キュー・システムを構築しています。ワーカーを起動してジョブを処理する前に、MongoDB コレクションへの挿入を listen" するにはどうしたらよいでしょうか?

数秒ごとにポーリングして前回からの変更があるかどうかを確認する必要がありますか、それとも私のスクリプトで挿入が発生するのを待つ方法がありますか?

これは私が取り組んでいるPHPのプロジェクトですが、Rubyや言語にとらわれずに自由に回答してください。

どのように解決するのですか?

MongoDBには、以下のようなものがあります。 capped collections tailable cursors で、MongoDBがリスナーにデータをプッシュできるようにします。

A capped collection は、基本的にサイズが固定で、挿入のみが可能なコレクションです。作成方法は以下の通りです。

db.createCollection("messages", { capped: true, size: 100000000 })

MongoDB 利用可能カーソル ( Jonathan H. Wageによるオリジナル投稿 )

ルビー

coll = db.collection('my_collection')
cursor = Mongo::Cursor.new(coll, :tailable => true)
loop do
  if doc = cursor.next_document
    puts doc
  else
    sleep 1
  end
end

PHP

$mongo = new Mongo();
$db = $mongo->selectDB('my_db')
$coll = $db->selectCollection('my_collection');
$cursor = $coll->find()->tailable(true);
while (true) {
    if ($cursor->hasNext()) {
        $doc = $cursor->getNext();
        print_r($doc);
    } else {
        sleep(1);
    }
}

パイソン (by ロバート・スチュワート)

from pymongo import Connection
import time

db = Connection().my_db
coll = db.my_collection
cursor = coll.find(tailable=True)
while cursor.alive:
    try:
        doc = cursor.next()
        print doc
    except StopIteration:
        time.sleep(1)

パール (by マックス )

use 5.010;

use strict;
use warnings;
use MongoDB;

my $db = MongoDB::Connection->new;
my $coll = $db->my_db->my_collection;
my $cursor = $coll->find->tailable(1);
for (;;)
{
    if (defined(my $doc = $cursor->next))
    {
        say $doc;
    }
    else
    {
        sleep 1;
    }
}

その他のリソース

Ruby/Node.js チュートリアルでは、MongoDB のキャップされたコレクションへの挿入をリッスンするアプリケーションの作成方法を説明します。

テーラブルカーソルについてより詳しく説明した記事です。

テーラブルカーソルを使用したPHP、Ruby、Python、Perlの例です。