Подтвердить что ты не робот

Пимонго - хвостохранилище

Я пытаюсь реализовать паб /sub на коллекции mongo oplog. Предоставленный код работает, без опции tailable = True (он вернет все документы), но как только я передам его курсору, он ничего не запишет (даже после внесения изменений в нужную коллекцию).

Я использую pymongo 2.7.2

while(True):
    with self.database.connect() as connection:
        cursor = connection['local'].oplog.rs.find(
            {'ns': self.collection},
            await_data = True,
            tailable = True
        )

        cursor.add_option(_QUERY_OPTIONS['oplog_replay'])

        while cursor.alive:
            try:
                doc = cursor.next()

                print doc
            except(AutoReconnect, StopIteration):
                time.sleep(1)

Я попробовал несколько решений, но он по-прежнему не работает, как только добавляется опция tailable. Oplog настроен правильно, поскольку модуль mongo-oplog из nodejs работает, как ожидалось.

Возможный дублировать (нет принятого ответа)

4b9b3361

Ответ 1

Вам нужно запросить поле "ts" oplog и отслеживать последний прочитанный документ (через метку времени) в случае воссоздания курсора. Вот пример, который вы можете изменить в соответствии с вашими потребностями:

import time

import pymongo

c = pymongo.MongoClient()
# Uncomment this for master/slave.
# oplog = c.local.oplog['$main']
# Uncomment this for replica sets.
oplog = c.local.oplog.rs
first = oplog.find().sort('$natural', pymongo.DESCENDING).limit(-1).next()
ts = first['ts']

while True:
    cursor = oplog.find({'ts': {'$gt': ts}}, tailable=True, await_data=True)
    # oplogReplay flag - not exposed in the public API
    cursor.add_option(8)
    while cursor.alive:
        for doc in cursor:
            ts = doc['ts']
            # Do something...
        time.sleep(1)