복붙노트

[MONGODB] 어떻게 MongoDB의 수집에 대한 변경 사항을 듣는?

MONGODB

어떻게 MongoDB의 수집에 대한 변경 사항을 듣는?

나는 데이터 저장소로 MongoDB를 배경 작업 큐 시스템의 종류를 만드는거야. 어떻게 일을 처리하기 위해 노동자를 산란하기 전에 MongoDB의 컬렉션 삽입 "수신"할 수 있습니까? 내가 지난번에 어떤 변화가 있는지 확인하기 위해 몇 초마다 폴링해야하거나 삽입이 발생하는 내 스크립트가 기다릴 수있는 방법이 있습니까? 이것은 내가 작업하지만, 루비 또는 언어 불가지론에 대한 답변 주시기하고있는 PHP 프로젝트입니다.

해결법

  1. ==============================

    1.당신이 트리거처럼 소리를 많이 생각하고있다. MongoDB를하지만 ​​어떤 사람들은 약간의 트릭을 사용하여 "자신의 압연"한 트리거에 대한 지원하지 않습니다. 여기서 핵심은 oplog입니다.

    당신이 트리거처럼 소리를 많이 생각하고있다. MongoDB를하지만 ​​어떤 사람들은 약간의 트릭을 사용하여 "자신의 압연"한 트리거에 대한 지원하지 않습니다. 여기서 핵심은 oplog입니다.

    당신이 복제 세트에 MongoDB의를 실행할 때 작동합니다 (oplog라고도 함) 로그인하려면 MongoDB의 작업이 모두 기록됩니다. oplog는 기본적으로 데이터에 대한 수정의 단지 실행 목록입니다. 설정이 oplog 변경 사항을 듣고 다음 로컬 변경 사항을 적용하여 기능을 복제.

    이 소리는 잘 알고 있습니까?

    내가 여기에 상세하게 전 과정을 할 수 없습니다, 그것은 문서의 여러 페이지를하지만, 당신이 필요로하는 도구를 사용할 수 있습니다.

    oplog에 우선 몇 가지 쓰기 업  - 간단한 설명  -합니다 (oplog를 포함) 로컬 모음의 레이아웃

    또한 tailable 커서를 활용하는 것이 좋습니다. 이 대신 그들을 위해 폴링의 변경을 수신 할 수있는 방법을 제공합니다. 이 지원되는 기능입니다 때문에 복제가, tailable 커서를 사용합니다.

  2. ==============================

    2.MongoDB를가 MongoDB를가 리스너에 데이터를 푸시 할 수 있습니다 덮인 컬렉션과 tailable 커서이라는 것이있다.

    MongoDB를가 MongoDB를가 리스너에 데이터를 푸시 할 수 있습니다 덮인 컬렉션과 tailable 커서이라는 것이있다.

    캡핑 컬렉션은 본질적으로 고정 된 크기이며, 단지 삽입을 허용하는 집합이다. 여기 하나를 만드는 같을 것이다 무엇 :

    db.createCollection("messages", { capped: true, size: 100000000 })
    

    루비

    coll = db.collection('my_collection')
    cursor = Mongo::Cursor.new(coll, :tailable => true)
    loop do
      if doc = cursor.next_document
        puts doc
      else
        sleep 1
      end
    end
    

    PHP

    $mongo = new Mongo();
    $db = $mongo->selectDB('my_db')
    $coll = $db->selectCollection('my_collection');
    $cursor = $coll->find()->tailable(true);
    while (true) {
        if ($cursor->hasNext()) {
            $doc = $cursor->getNext();
            print_r($doc);
        } else {
            sleep(1);
        }
    }
    

    파이썬 (로버트 스튜어트)

    from pymongo import Connection
    import time
    
    db = Connection().my_db
    coll = db.my_collection
    cursor = coll.find(tailable=True)
    while cursor.alive:
        try:
            doc = cursor.next()
            print doc
        except StopIteration:
            time.sleep(1)
    

    (최대로) 펄

    use 5.010;
    
    use strict;
    use warnings;
    use MongoDB;
    
    my $db = MongoDB::Connection->new;
    my $coll = $db->my_db->my_collection;
    my $cursor = $coll->find->tailable(1);
    for (;;)
    {
        if (defined(my $doc = $cursor->next))
        {
            say $doc;
        }
        else
        {
            sleep 1;
        }
    }
    

    응용 프로그램을 만드는 과정을 안내 루비 / Node.js를 설명하는 MongoDB에 덮인 모음에서 삽입을 수신합니다.

    더 자세히 tailable 커서에 대해 이야기 기사.

    tailable 커서를 사용하는 PHP, 루비, 파이썬, 펄 예.

  3. ==============================

    3.MongoDB를 3.6부터이 사용할 수있는 변경 스트림이라는 새로운 알림 API가있을 것입니다. 예를 들어이 블로그 게시물을 참조하십시오. 그것에서 예 :

    MongoDB를 3.6부터이 사용할 수있는 변경 스트림이라는 새로운 알림 API가있을 것입니다. 예를 들어이 블로그 게시물을 참조하십시오. 그것에서 예 :

    cursor = client.my_db.my_collection.changes([
        {'$match': {
            'operationType': {'$in': ['insert', 'replace']}
        }},
        {'$match': {
            'newDocument.n': {'$gte': 1}
        }}
    ])
    
    # Loops forever.
    for change in cursor:
        print(change['newDocument'])
    
  4. ==============================

    4.* 편집 : 나는이 작업을 수행하는 방법에 대한 기사를 쓴 https://medium.com/riow/mongodb-data-collection-change-85b63d96ff76

    * 편집 : 나는이 작업을 수행하는 방법에 대한 기사를 쓴 https://medium.com/riow/mongodb-data-collection-change-85b63d96ff76

    그것은 MongoDB를 3.6의 새로운 기능 https://docs.mongodb.com/manual/release-notes/3.6/ 2018년 1월 10일

    $ mongod --version
    db version v3.6.2
    

    위해 사용 changeStreams에서 데이터베이스 복제를 설정해야합니다

    데이터베이스는 기본적으로 "독립"입니다.

    다음의 예는 당신이 사용할 수있는 방법에 대한 실제적인 응용 프로그램입니다. * 구체적으로 노드.

    /* file.js */
    'use strict'
    
    
    module.exports = function (
        app,
        io,
        User // Collection Name
    ) {
        // SET WATCH ON COLLECTION 
        const changeStream = User.watch();  
    
        // Socket Connection  
        io.on('connection', function (socket) {
            console.log('Connection!');
    
            // USERS - Change
            changeStream.on('change', function(change) {
                console.log('COLLECTION CHANGED');
    
                User.find({}, (err, data) => {
                    if (err) throw err;
    
                    if (data) {
                        // RESEND ALL USERS
                        socket.emit('users', data);
                    }
                });
            });
        });
    };
    /* END - file.js */
    

    유용한 링크: https://docs.mongodb.com/manual/tutorial/convert-standalone-to-replica-set https://docs.mongodb.com/manual/tutorial/change-streams-example

    https://docs.mongodb.com/v3.6/tutorial/change-streams-example http://plusnconsulting.com/post/MongoDB-Change-Streams

  5. ==============================

    5.MongoDB를 버전 3.6은 이제 기본적으로 트리거 / 알림과 같은 사용 사례에 대한 허용 OpLog의 상단에 API 인 변화 스트림이 포함되어 있습니다.

    MongoDB를 버전 3.6은 이제 기본적으로 트리거 / 알림과 같은 사용 사례에 대한 허용 OpLog의 상단에 API 인 변화 스트림이 포함되어 있습니다.

    다음은 자바 예제 링크입니다 : http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/

    NodeJS 예제 같이 보일 수 있습니다

     var MongoClient = require('mongodb').MongoClient;
        MongoClient.connect("mongodb://localhost:22000/MyStore?readConcern=majority")
         .then(function(client){
           let db = client.db('MyStore')
    
           let change_streams = db.collection('products').watch()
              change_streams.on('change', function(change){
                console.log(JSON.stringify(change));
              });
          });
    
  6. ==============================

    6.또는, 표준 몽고 FindAndUpdate 방법을 사용할 수 있으며, 콜백이 실행될 때 콜백 내에서, (노드)를 EventEmitter 이벤트가 발생.

    또는, 표준 몽고 FindAndUpdate 방법을 사용할 수 있으며, 콜백이 실행될 때 콜백 내에서, (노드)를 EventEmitter 이벤트가 발생.

    이 이벤트에 대한 응용 프로그램이나 아키텍처 듣기의 다른 부분은 업데이트를 통지하고, 모든 관련 데이터도 전송됩니다. 이 몽고에서 알림을 달성하는 정말 간단한 방법입니다.

  7. ==============================

    7.이러한 답변의 대부분은 업데이트 만하면 새 레코드와하지를 제공 및 / 또는 매우 ineffecient있는 것

    이러한 답변의 대부분은 업데이트 만하면 새 레코드와하지를 제공 및 / 또는 매우 ineffecient있는 것

    MongoDB의 모든 변경 사항을 얻고 무엇을 것 그것으로 할 oplog.rs 모음 :이 작업을 수행하는 신뢰할 수있는 유일한, 성능이 좋은 방법은 tailable 로컬 DB에 커서를 만드는 것입니다. (MongoDB를도 지원 복제이 내부적으로 다소 않습니다!)

    oplog에 포함 된 내용의 설명 : https://www.compose.com/articles/the-mongodb-oplog-and-node-js/

    oplog으로 수행 할 수 있습니다 무엇을 주위에 API를 제공하는 Node.js를 라이브러리의 예 : https://github.com/cayasso/mongo-oplog

  8. ==============================

    8.여기에서 찾을 수있는 작업 자바 예제가있다.

    여기에서 찾을 수있는 작업 자바 예제가있다.

     MongoClient mongoClient = new MongoClient();
        DBCollection coll = mongoClient.getDatabase("local").getCollection("oplog.rs");
    
        DBCursor cur = coll.find().sort(BasicDBObjectBuilder.start("$natural", 1).get())
                .addOption(Bytes.QUERYOPTION_TAILABLE | Bytes.QUERYOPTION_AWAITDATA);
    
        System.out.println("== open cursor ==");
    
        Runnable task = () -> {
            System.out.println("\tWaiting for events");
            while (cur.hasNext()) {
                DBObject obj = cur.next();
                System.out.println( obj );
    
            }
        };
        new Thread(task).start();
    

    열쇠는 여기에 주어진 쿼리 옵션입니다.

    당신이 때마다 모든 데이터를로드 할 필요가없는 경우 또한 당신은, 찾기 쿼리를 변경할 수 있습니다.

    BasicDBObject query= new BasicDBObject();
    query.put("ts", new BasicDBObject("$gt", new BsonTimestamp(1471952088, 1))); //timestamp is within some range
    query.put("op", "i"); //Only insert operation
    
    DBCursor cur = coll.find(query).sort(BasicDBObjectBuilder.start("$natural", 1).get())
    .addOption(Bytes.QUERYOPTION_TAILABLE | Bytes.QUERYOPTION_AWAITDATA);
    
  9. ==============================

    9.대신 출력을보고 실제로, 당신은 통지를 얻을 해달라고 이유 뭔가 새로운 몽구스 스키마에 의해 제공되었다 그 미들웨어를 사용하여 삽입 될 때

    대신 출력을보고 실제로, 당신은 통지를 얻을 해달라고 이유 뭔가 새로운 몽구스 스키마에 의해 제공되었다 그 미들웨어를 사용하여 삽입 될 때

    당신은 새 문서를 삽입의 이벤트를 잡아이 삽입 완료 후 뭔가를 할 수

  10. ==============================

    10.MongoDB의 스티치 호출 가능한 서비스의 멋진 세트가있다. 스티치 기능 / 트리거로 봐. 이 클라우드 기반의 유료 서비스 (AWS) 참고. 귀하의 경우, 삽입에, 당신은 자바 스크립트로 작성된 사용자 정의 함수를 호출 할 수 있습니다.

    MongoDB의 스티치 호출 가능한 서비스의 멋진 세트가있다. 스티치 기능 / 트리거로 봐. 이 클라우드 기반의 유료 서비스 (AWS) 참고. 귀하의 경우, 삽입에, 당신은 자바 스크립트로 작성된 사용자 정의 함수를 호출 할 수 있습니다.

  11. from https://stackoverflow.com/questions/9691316/how-to-listen-for-changes-to-a-mongodb-collection by cc-by-sa and MIT license