sql >> データベース >  >> NoSQL >> MongoDB

PythonはMongodbのOplogへの変更をどのように観察できますか

    少し前に、PythonでMongoDBの増分バックアップツールを作成しました。このツールは、oplogを調整することにより、データの変更を監視します 。これがコードの関連部分です。

    更新された回答、MongDB3.6以降

    datdinhquocが以下のコメントで巧妙に指摘しているように、MongoDB 3.6以降には、ストリームの変更> 。

    更新された回答、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)
    

    http://api.mongodb.com/python/current/examplesも参照してください。 /tailable.html

    元の回答、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. MongoError:最初の接続時にサーバー[localhost:27017]に接続できませんでした

    2. ノードMongoDBの追加中にReplicaSetIdが競合する

    3. MongoDB $ hour

    4. Dockerを介してMongoDBで認証を有効にする方法は?