Пимонго - хвостохранилище
Я пытаюсь реализовать паб /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 работает, как ожидалось.
Возможный дублировать (нет принятого ответа)
Ответы
Ответ 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)