MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Bagaimana Python Dapat Mengamati Perubahan pada Oplog Mongodb

Saya menulis alat cadangan tambahan untuk MongoDB beberapa waktu lalu, dengan Python. Alat ini memantau perubahan data dengan mengikuti oplog . Berikut adalah bagian kode yang relevan.

Jawaban yang diperbarui, MongDB 3.6+

Seperti yang ditunjukkan datdinhquoc dengan cerdik dalam komentar di bawah, untuk MongoDB 3.6 dan lebih tinggi ada Ubah Aliran .

Jawaban yang diperbarui, pymongo 3

from time import sleep

from pymongo import MongoClient, ASCENDING
from pymongo.cursor import CursorType
from pymongo.errors import AutoReconnect

# Time to wait for data or connection.
_SLEEP = 1.0

if __name__ == '__main__':
    oplog = MongoClient().local.oplog.rs
    stamp = oplog.find().sort('$natural', ASCENDING).limit(-1).next()['ts']

    while True:
        kw = {}

        kw['filter'] = {'ts': {'$gt': stamp}}
        kw['cursor_type'] = CursorType.TAILABLE_AWAIT
        kw['oplog_replay'] = True

        cursor = oplog.find(**kw)

        try:
            while cursor.alive:
                for doc in cursor:
                    stamp = doc['ts']

                    print(doc)  # Do something with doc.

                sleep(_SLEEP)

        except AutoReconnect:
            sleep(_SLEEP)

Lihat juga http://api.mongodb.com/python/current/examples /tailable.html .

Jawaban asli, pymongo 2

from time import sleep

from pymongo import MongoClient
from pymongo.cursor import _QUERY_OPTIONS
from pymongo.errors import AutoReconnect
from bson.timestamp import Timestamp

# Tailable cursor options.
_TAIL_OPTS = {'tailable': True, 'await_data': True}

# Time to wait for data or connection.
_SLEEP = 10

if __name__ == '__main__':
    db = MongoClient().local

    while True:
        query = {'ts': {'$gt': Timestamp(some_timestamp, 0)}}  # Replace with your query.
        cursor = db.oplog.rs.find(query, **_TAIL_OPTS)

        cursor.add_option(_QUERY_OPTIONS['oplog_replay'])

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

                    # Do something with doc.

                except (AutoReconnect, StopIteration):
                    sleep(_SLEEP)

        finally:
            cursor.close()


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. cara mendapatkan otentikasi mongodb dengan benar

  2. Upsert Cepat atau Massal di pymongo

  3. Perbarui model dengan Mongoose, Express, NodeJS

  4. Tentukan beberapa kriteria dalam kueri mongo db musim semi

  5. MongoDB $replaceOne