2015-05-22 12 views
11
oplog

मैं मोंगो के oplog संग्रह पर एक पब/उप लागू करने के लिए कोशिश कर रहा हूँ। बशर्ते कोड काम करता है, बिनाtailable = True विकल्प सेट (यह सभी डॉक्स वापस आ जाएगी), लेकिन जैसे ही मैं इसे कर्सर को पारित यह होगा पिक नहीं कुछ भी (यहां तक ​​कि वांछित संग्रह में परिवर्तन करने के बाद)।Pymongo - पीछा

मैं 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 ठीक तरह से स्थापित है, NodeJS कार्यों से mongo-oplog मॉड्यूल के बाद से अपेक्षा के अनुरूप।

संभव duplicate (कोई स्वीकार किए जाते हैं जवाब)

उत्तर

4

आप 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) 
: यहाँ एक उदाहरण आप अपनी आवश्यकताओं के लिए उसमें बदलाव कर सकते हैं
संबंधित मुद्दे