[MONGODB] 어떻게 MongoDB의 수집에 대한 변경 사항을 듣는?
MONGODB어떻게 MongoDB의 수집에 대한 변경 사항을 듣는?
나는 데이터 저장소로 MongoDB를 배경 작업 큐 시스템의 종류를 만드는거야. 어떻게 일을 처리하기 위해 노동자를 산란하기 전에 MongoDB의 컬렉션 삽입 "수신"할 수 있습니까? 내가 지난번에 어떤 변화가 있는지 확인하기 위해 몇 초마다 폴링해야하거나 삽입이 발생하는 내 스크립트가 기다릴 수있는 방법이 있습니까? 이것은 내가 작업하지만, 루비 또는 언어 불가지론에 대한 답변 주시기하고있는 PHP 프로젝트입니다.
해결법
-
==============================
1.당신이 트리거처럼 소리를 많이 생각하고있다. MongoDB를하지만 어떤 사람들은 약간의 트릭을 사용하여 "자신의 압연"한 트리거에 대한 지원하지 않습니다. 여기서 핵심은 oplog입니다.
당신이 트리거처럼 소리를 많이 생각하고있다. MongoDB를하지만 어떤 사람들은 약간의 트릭을 사용하여 "자신의 압연"한 트리거에 대한 지원하지 않습니다. 여기서 핵심은 oplog입니다.
당신이 복제 세트에 MongoDB의를 실행할 때 작동합니다 (oplog라고도 함) 로그인하려면 MongoDB의 작업이 모두 기록됩니다. oplog는 기본적으로 데이터에 대한 수정의 단지 실행 목록입니다. 설정이 oplog 변경 사항을 듣고 다음 로컬 변경 사항을 적용하여 기능을 복제.
이 소리는 잘 알고 있습니까?
내가 여기에 상세하게 전 과정을 할 수 없습니다, 그것은 문서의 여러 페이지를하지만, 당신이 필요로하는 도구를 사용할 수 있습니다.
oplog에 우선 몇 가지 쓰기 업 - 간단한 설명 -합니다 (oplog를 포함) 로컬 모음의 레이아웃
또한 tailable 커서를 활용하는 것이 좋습니다. 이 대신 그들을 위해 폴링의 변경을 수신 할 수있는 방법을 제공합니다. 이 지원되는 기능입니다 때문에 복제가, tailable 커서를 사용합니다.
-
==============================
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.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.* 편집 : 나는이 작업을 수행하는 방법에 대한 기사를 쓴 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.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.또는, 표준 몽고 FindAndUpdate 방법을 사용할 수 있으며, 콜백이 실행될 때 콜백 내에서, (노드)를 EventEmitter 이벤트가 발생.
또는, 표준 몽고 FindAndUpdate 방법을 사용할 수 있으며, 콜백이 실행될 때 콜백 내에서, (노드)를 EventEmitter 이벤트가 발생.
이 이벤트에 대한 응용 프로그램이나 아키텍처 듣기의 다른 부분은 업데이트를 통지하고, 모든 관련 데이터도 전송됩니다. 이 몽고에서 알림을 달성하는 정말 간단한 방법입니다.
-
==============================
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.여기에서 찾을 수있는 작업 자바 예제가있다.
여기에서 찾을 수있는 작업 자바 예제가있다.
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.대신 출력을보고 실제로, 당신은 통지를 얻을 해달라고 이유 뭔가 새로운 몽구스 스키마에 의해 제공되었다 그 미들웨어를 사용하여 삽입 될 때
대신 출력을보고 실제로, 당신은 통지를 얻을 해달라고 이유 뭔가 새로운 몽구스 스키마에 의해 제공되었다 그 미들웨어를 사용하여 삽입 될 때
당신은 새 문서를 삽입의 이벤트를 잡아이 삽입 완료 후 뭔가를 할 수
-
==============================
10.MongoDB의 스티치 호출 가능한 서비스의 멋진 세트가있다. 스티치 기능 / 트리거로 봐. 이 클라우드 기반의 유료 서비스 (AWS) 참고. 귀하의 경우, 삽입에, 당신은 자바 스크립트로 작성된 사용자 정의 함수를 호출 할 수 있습니다.
MongoDB의 스티치 호출 가능한 서비스의 멋진 세트가있다. 스티치 기능 / 트리거로 봐. 이 클라우드 기반의 유료 서비스 (AWS) 참고. 귀하의 경우, 삽입에, 당신은 자바 스크립트로 작성된 사용자 정의 함수를 호출 할 수 있습니다.
from https://stackoverflow.com/questions/9691316/how-to-listen-for-changes-to-a-mongodb-collection by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를이 : one..how에 여러 컬렉션에서 데이터를 결합? (0) | 2019.11.30 |
---|---|
[MONGODB] MongoDB를 $ 중첩 된 배열에 밀어 (0) | 2019.11.30 |
[MONGODB] 객체 중첩 대 몽구스 채우기 (0) | 2019.11.29 |
[MONGODB] MongoDB를 : 그것은 대소 문자를 구분하지 쿼리를 만들 수 있습니까? (0) | 2019.11.29 |
[MONGODB] $ 풀림없이 여러 수준을 조회 $? (0) | 2019.11.29 |