如何监听对MongoDB集合的更改?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (121)

我使用MongoDB作为数据存储创建了一种后台作业队列系统。怎么做到监听插入mongoDB的项目?

提问于
用户回答回答于

MongoDB具有所谓的capped collections并且tailable cursors允许MongoDB将数据推送到监听器。

A capped collection本质上是一个固定大小的集合,只允许插入。

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

ruby

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);
    }
}

Python

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)

Perl

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;
    }
}
用户回答回答于

你在做的很像触发器。MongoDB对触发器没有任何支持,但有些人使用一些技巧“推出了自己的”。

在副本集中运行MongoDB时,所有MongoDB操作都会记录到操作日志(称为oplog)。oplog基本上只是一个对数据进行修改的运行列表。通过监听此oplog上的更改并在本地应用更改,副本设置功能。

扫码关注云+社区