একটি মঙ্গোডিবি সংগ্রহে পরিবর্তনগুলি কীভাবে শুনবেন?


200

আমি ডেটা স্টোর হিসাবে মঙ্গোডিবি দিয়ে এক ধরণের ব্যাকগ্রাউন্ড জব ক্যু সিস্টেম তৈরি করছি। শ্রমিকদের কাজ প্রক্রিয়া করার জন্য স্প্যানিংয়ের আগে একটি মঙ্গোডিবি সংগ্রহের সন্নিবেশগুলির জন্য আমি কীভাবে "শুনি"? গতবারের থেকে কোনও পরিবর্তন হয়েছে কিনা তা দেখার জন্য কি আমার কয়েক সেকেন্ডে পোলিং করা দরকার, বা আমার স্ক্রিপ্টটি সন্নিবেশ ঘটানোর জন্য অপেক্ষা করতে পারে এমন কোনও উপায় আছে? এটি এমন একটি পিএইচপি প্রকল্প যা আমি নিয়ে কাজ করছি তবে রুবি বা ভাষা অজ্ঞায়নের মধ্যে নির্দ্বিধায় উত্তর দিন।


1
আপনার দৃশ্যের সমাধানের জন্য মংগোডিবি 3.6 এ স্ট্রিমগুলি পরিবর্তন করা হয়েছে। ডকস.মোংডব.সমানুয়াল / এক্সচেঞ্জ স্ট্রিমস এছাড়াও আপনি যদি মংগোডিবি আটলাস ব্যবহার করছেন তবে আপনি স্টিচ ট্রিগারদের উত্তোলন করতে পারবেন যা আপনাকে সন্নিবেশ / আপডেট / মুছতে / ইত্যাদি প্রতিক্রিয়া হিসাবে ফাংশন সম্পাদন করতে দেয়। docs.mongodb.com / স্টিচ / ট্রিগার / ওভারভিউ আর আফলোগ পার্স করার দরকার নেই।
রবার্ট ওয়াল্টারস

উত্তর:


111

আপনি যা ভাবছেন তা অনেকটা ট্রিগারগুলির মতো। মঙ্গোডিবি-র ট্রিগারগুলির জন্য কোনও সমর্থন নেই, তবে কিছু লোক কিছু কৌশল ব্যবহার করে "নিজস্ব রোলড" করেছে। এখানে মূল কীটি অপলগ।

আপনি যখন কোনও প্রতিলিপি সেটে মঙ্গোডিবি পরিচালনা করেন, সমস্ত মঙ্গোডিবি ক্রিয়াকলাপ অপারেশন লগে লগইন করা হয় (ওপলগ হিসাবে পরিচিত)। ওপলগ মূলত ডেটাতে করা পরিবর্তনগুলির একটি চলমান তালিকা। এই ওপ্লগের পরিবর্তনগুলি শুনে এবং স্থানীয়ভাবে পরিবর্তনগুলি প্রয়োগ করে প্রতিরূপ সেটের কাজ করে।

এই শব্দটি কি পরিচিত?

আমি এখানে পুরো প্রক্রিয়াটি বিশদ করতে পারছি না, এটি ডকুমেন্টেশনের বেশ কয়েকটি পৃষ্ঠা, তবে আপনার প্রয়োজনীয় সরঞ্জামগুলি উপলব্ধ।

প্রথমে ওপ্লোগে কিছু লিখিত-আপ - সংক্ষিপ্ত বিবরণ - সংগ্রহের বিন্যাসlocal (যা ওপলগ ধারণ করে)

আপনি প্রাপ্য কার্সারও উপার্জন করতে চাইবেন । এগুলি আপনাকে তাদের ভোট দেওয়ার পরিবর্তে পরিবর্তনের জন্য শোনার একটি উপায় সরবরাহ করবে। নোট করুন যে প্রতিলিপিটি প্রযোজ্য কার্সার ব্যবহার করে, সুতরাং এটি একটি সমর্থিত বৈশিষ্ট্য।


1
হুম ... আমি যা মনে করি ঠিক তাই নয়। আমি এই মুহুর্তে কেবল একটি উদাহরণ চালাচ্ছি (দাস নেই)। তাহলে হয়ত আরও মৌলিক সমাধান?
অ্যান্ড্রু

17
আপনি --replSetবিকল্পটি দিয়ে সার্ভারটি শুরু করতে পারেন এবং এটি তৈরি / পপুলেট করবে oplog। এমনকি মাধ্যমিক ছাড়াও। এটি অবশ্যই ডিবি পরিবর্তনের "শ্রবণ" করার একমাত্র উপায়।
গেটস ভিপি

2
স্থানীয়ভাবে ডিবিতে লগিং পরিবর্তনের জন্য ওপলগ সেটআপ করার পদ্ধতিটি এটি একটি সুন্দর বর্ণনা: য়ূলেক্স্যামল.ওয়ার্ডপ্রেস.কম
০৯ /

Cooooool! এটাই আমি চাই এবং আমি এনপিএম-এ 'মঙ্গো-ওপ্লগ' নামে একটি লাইব্রেরি পেয়েছি। তাই খুশি
p

আমি এই উত্তরটি লেখার সময় দ্বারা সম্মত হয়েছি ট্রিগারগুলি সম্ভবত এটি উপলভ্য নয় তবে যারা এখানে অবতরণ করেছেন তাদের পক্ষে, এখনই একটি বিকল্প উপলব্ধ রয়েছে, মঙ্গোডিবি স্টিচ ( ডকস.মোংডোব / স্টিচ /# স্টিচ) এবং স্টিচ ট্রিগার ( ডকস) দেখুন। mongodb.com/stitch/triggers ) ..
whoami

102

মঙ্গোডিবির কাছে যা বলা হয় তা রয়েছে capped collectionsএবং tailable cursorsএটি মঙ্গোডিবিকে শ্রোতাদের কাছে ডেটা ঠেকাতে দেয়।

capped collectionমূলত একটি সংগ্রহ যা একটি নির্দিষ্ট আকার এবং কেবল সন্নিবেশকে অনুমতি দেয়। এটি তৈরির মতো দেখতে এখানে কী রয়েছে:

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

পিএইচপি

$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;
    }
}

অতিরিক্ত সম্পদ:

রুবি / নোড.জেএস টিউটোরিয়াল যা কোনও মঙ্গোডিবি ক্যাফেড সংগ্রহে সন্নিবেশ শোনার জন্য একটি অ্যাপ্লিকেশন তৈরির মাধ্যমে আপনাকে নিয়ে যায়।

আরও বিশদে বিশিষ্ট কার্সার সম্পর্কে কথা বলার একটি নিবন্ধ

পিএইচপি, রুবি, পাইথন, এবং পার্ল উদাহরণস্বরূপ কার্সার ব্যবহারের উদাহরণ।


70
ঘুম 1? সত্যি? উত্পাদন কোডের জন্য? কীভাবে ভোট হচ্ছে না?
আরবিপি

2
@ আরবিপি হাহা, আমি কখনও বলিনি যে এটি প্রোডাকশন কোড, তবে আপনি ঠিক বলেছেন, এক সেকেন্ডের জন্য ঘুমানো ভাল অনুশীলন নয়। খুব নিশ্চিত যে আমি অন্য কোথাও থেকে উদাহরণ পেয়েছি। যদিও এটি রিফ্যাক্টর করবেন তা নিশ্চিত নন।
অ্যান্ড্রু

14
@ ক্রো কারণ এই অপ্রাসঙ্গিক বিবরণগুলি নতুন প্রোগ্রামাররা প্রোডাকশন কোডে রাখবে যা এটি খারাপ কেন তা বুঝতে পারে না।
ক্যাটফিশ

3
আমি আপনার বক্তব্যটি বুঝতে পেরেছি, তবে কিছু নতুন প্রোগ্রামার উত্পাদনে "স্লিপ 1" যুক্ত করার আশা করা প্রায় আপত্তিজনক! মানে, আমি অবাক হব না ... তবে যদি কেউ এটিকে উত্পাদনে রাখেন, তবে কমপক্ষে কঠিন উপায় এবং চিরকাল জানতে পারবেন ..
হাহাহা

19
প্রযোজনায় টাইম.স্লিপ (১) করে কি ভুল?
আল জোহরি

44

মোংগোডিবি ৩.6 থেকে পরিবর্তন স্ট্রিম নামে একটি নতুন বিজ্ঞপ্তি এপিআই আসবে যা আপনি এটির জন্য ব্যবহার করতে পারেন। একটি উদাহরণের জন্য এই ব্লগ পোস্ট দেখুন । এটি থেকে উদাহরণ:

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
কেন? তুমি কি বিস্তারিত বলতে পারো? এটা এখন স্ট্যান্ডার্ড উপায়?
মিটার

1
কীভাবে? পোলিং ব্যবহার করবেন না - লুপ ইত্যাদির পরিবর্তে আপনার একটি সন্নিবিষ্ট পদ্ধতির প্রয়োজন
আলেকজান্ডার মিলস

3
আপনি এখানে পোলিং কোথায় দেখছেন?
মিতার

আমি মনে করি তিনি / তিনি শেষ লুপটি উল্লেখ করছেন। তবে আমি মনে করি পাইমঙ্গো কেবল এটি সমর্থন করে। মোটরটিতে একটি অ্যাসিঙ্ক / ইভেন্ট শ্রোতার-শৈলীর প্রয়োগ থাকতে পারে।
শেন হু

41

এটি দেখুন: স্ট্রিম পরিবর্তন করুন

জানুয়ারী 10, 2018 - প্রকাশ 3.6

* সম্পাদনা: আমি এই https://medium.com/riow/mongodb-data-col લેક્- পরিবর্তন- 85b63d96ff76 কীভাবে করবেন সে সম্পর্কে একটি নিবন্ধ লিখেছিলাম

https://docs.mongodb.com/v3.6/changeStreams/


এটা তোলে নতুন MongoDB 3.6 https://docs.mongodb.com/manual/release-notes/3.6/ 2018/01/10

$ mongod --version
db version v3.6.2

চেঞ্জস্ট্রিমগুলি ব্যবহার করার জন্য ডাটাবেস অবশ্যই একটি প্রতিলিপি সেট হতে হবে

প্রতিলিপি সেট সম্পর্কে আরও: https://docs.mongodb.com/manual/replication/

আপনার ডেটাবেস ডিফল্ট হিসাবে " স্ট্যান্ডअোনাল " হবে be

একটি স্ট্যান্ডেলোনকে একটি প্রতিরূপ সেটে কীভাবে রূপান্তর করবেন: https://docs.mongodb.com/manual/tutorial/convers-standalone-to-replica-set/


আপনি কীভাবে এটি ব্যবহার করতে পারেন তার জন্য নীচের উদাহরণটি একটি ব্যবহারিক প্রয়োগ।
* বিশেষত নোডের জন্য।

/* 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- পরিবর্তন- স্ট্রিম


সমস্ত সম্পাদনা সম্পর্কে দুঃখিত, এসও আমার "লিঙ্কগুলি" পছন্দ করেন নি (বলেছিলেন তারা ভুলভাবে ফর্ম্যাটেড কোড ছিল))
রিও ওয়েবার

1
আপনাকে ডাটাবেসটি জিজ্ঞাসা করতে হবে না, আমি মনে করি ঘড়ির () বা অনুরূপ সাথে, নতুন সার্ভারটি যে সার্ভারটি শোনা যাচ্ছে তাতে পাঠানো যেতে পারে
আলেকজান্ডার মিলস

22

মঙ্গোডিবি সংস্করণ ৩.6-এ এখন পরিবর্তন স্ট্রিম অন্তর্ভুক্ত রয়েছে যা মূলত ওপলগের শীর্ষে একটি এপিআই যা ট্রিগার / বিজ্ঞপ্তি-মতো ব্যবহারের ক্ষেত্রে অনুমতি দেয়।

এখানে একটি জাভা উদাহরণ একটি লিঙ্ক: http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/

একটি নোডজেএস উদাহরণ হতে পারে এর মতো দেখতে:

 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));
          });
      });

JSON.stringify অ্যান্ড্রয়েড স্টুডিওতে (অ্যান্ড্রয়েড অ্যাপ) এই ডেটা প্রাপ্ত করার জন্য খুব গুরুত্বপূর্ণ ..
ড্রাগনফায়ার

3

বিকল্পভাবে, আপনি স্ট্যান্ডার্ড মঙ্গো ফাইন্ডএন্ডআপডেট পদ্ধতিটি ব্যবহার করতে পারেন এবং কলব্যাকের মধ্যে কলব্যাক চালানো হলে একটি ইভেন্টইমিটার ইভেন্ট (নোডে) নিক্ষেপ করতে পারেন।

এই ইভেন্টটি শোনার অ্যাপ্লিকেশন বা আর্কিটেকচারের অন্য কোনও অংশ আপডেটের বিষয়ে অবহিত হবে এবং সেখানে প্রেরিত কোনও প্রাসঙ্গিক ডেটাও জানানো হবে। এটি মঙ্গোর কাছ থেকে বিজ্ঞপ্তিগুলি অর্জনের সত্যিই সহজ উপায়।


এটি অত্যন্ত অদক্ষ..আপনি প্রতিটি ফাইন্ডঅ্যান্ডআপেটের জন্য ডিবি লক করছেন!
যশ গুপ্ত

1
আমার অনুমান যে অ্যালেক্স কিছুটা আলাদাভাবে উত্তর দিচ্ছিল (নির্দিষ্টভাবে সন্নিবেশকে সম্বোধন করে না) তবে কীভাবে ক্লায়েন্টদের কাছে কোনও প্রকারের বিজ্ঞপ্তি প্রকাশ করা উচিত যখন আমরা মনে করি যে চাকরির পরিবর্তন হওয়ার সাথে সাথে আমাদের সারিবদ্ধ কাজের পরিবর্তনের পরিস্থিতি ঘটবে যা আমরা ধরে নিই , সফলভাবে সম্পূর্ণ বা ব্যর্থ। ক্লায়েন্টদের নোডে ওয়েবসকেট ব্যবহার করে সংযুক্ত হওয়ার সাথে তাদের সমস্তকেই FIndAndUpdate কলব্যাকের একটি সম্প্রচার ইভেন্টের সাথে পরিবর্তনের বিষয়ে অবহিত করা যেতে পারে যা রাষ্ট্র পরিবর্তন বার্তা গ্রহণের সময় বলা যেতে পারে। আমি বলব যে আপডেটগুলি করা দরকার হিসাবে এটি অকার্যকর নয়।
পিটার স্কট 21

3

এই উত্তরগুলির মধ্যে অনেকগুলি আপনাকে কেবল নতুন রেকর্ড দেয় এবং আপডেটগুলি না এবং / অথবা অত্যন্ত অকার্যকর

এটি করার একমাত্র নির্ভরযোগ্য, কার্যক্ষম উপায় হ'ল স্থানীয় ডিবিতে একটি প্রচ্ছদ কার্সার তৈরি করা: মঙ্গোডিবিতে সমস্ত পরিবর্তনগুলি পেতে ওলগ.আর সংগ্রহ সংগ্রহ এবং আপনি যা করতে চান তা করুন। (মোংগোডিবি এমনকি অভ্যন্তরীণভাবে প্রতিরূপের সমর্থন করতে আরও কমবেশি এটি করে!)

ওপলগ কী রয়েছে তার ব্যাখ্যা: https://www.compose.com/articles/the-mongodb-oplog-and-node-js/

নোড.জেএস লাইব্রেরির উদাহরণ যা ওপলগ দিয়ে কী কী করা যায় তার চারপাশে একটি API সরবরাহ করে: https://github.com/cayasso/mongo-oplog


2

মংগোডিবি স্টিচ নামে একটি দুর্দান্ত সেবা উপলব্ধ রয়েছে । দেখব সেলাই ফাংশন / ট্রিগার । দ্রষ্টব্য এটি মেঘ-ভিত্তিক প্রদত্ত পরিষেবা (AWS)। আপনার ক্ষেত্রে, একটি sertোকানোতে, আপনি জাভাস্ক্রিপ্টে লিখিত একটি কাস্টম ফাংশন কল করতে পারেন।

এখানে চিত্র বর্ণনা লিখুন


stackoverflow.com/users/486867/manish-jain - আপনার কী উদাহরণ রয়েছে যে কোনও টেবিলে ডেটা ?োকানো হয়েছিল এমন একটি REACT অ্যাপ্লিকেশনটি জানানোর জন্য কীভাবে সেলাই ব্যবহার করা যেতে পারে?
এম্লিসেট্রেস

1

এখানে একটি কাজের জাভা উদাহরণ রয়েছে যা এখানে পাওয়া যাবে

 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();

কীটি এখানে দেওয়া হয়েছে QUERY অপশন

এছাড়াও প্রতিবার সমস্ত ডেটা লোড করার প্রয়োজন না হলে আপনি অনুসন্ধানের অনুসন্ধানটিও পরিবর্তন করতে পারেন।

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);

1

প্রকৃতপক্ষে, আউটপুট দেখার পরিবর্তে, আপনি কেন নোটিশ পাবেন না যখন মংগুজ স্কিমা দ্বারা সরবরাহ করা মিডল ওয়্যার ব্যবহার করে নতুন কিছু সন্নিবেশ করা হয়েছে

আপনি একটি নতুন দস্তাবেজ সন্নিবেশ করার ইভেন্টটি ধরতে পারেন এবং এই সন্নিবেশ সম্পন্ন হওয়ার পরে কিছু করতে পারেন


আমার খারাপ। দুঃখিত জনাব.
ডুং এনগুইন

0

৩.6 এর পরে একজনকে ডাটাবেস ব্যবহারের অনুমতি দেওয়া হচ্ছে নিম্নলিখিত ডাটাবেসগুলি টাইগারগুলি ট্রিগার করে:

  • ইভেন্ট-চালিত ট্রিগার - সম্পর্কিত ডকুমেন্টগুলি স্বয়ংক্রিয়ভাবে আপডেট করতে, ডাউন স্ট্রিম পরিষেবাগুলিকে অবহিত করতে, মিশ্র কাজের চাপ, ডেটা অখণ্ডতা এবং নিরীক্ষণ সমর্থন করার জন্য ডেটা প্রচার
  • তফসিলযুক্ত ট্রিগার - তফসিলযুক্ত ডেটা পুনরুদ্ধার, প্রচার, সংরক্ষণাগার এবং বিশ্লেষণের কাজের চাপের জন্য দরকারী

আপনার অ্যাটলাস অ্যাকাউন্টে লগইন করুন Triggersএবং ইন্টারফেস নির্বাচন করুন এবং নতুন ট্রিগার যুক্ত করুন:

এখানে চিত্র বর্ণনা লিখুন

আরও সেটিংস বা বিশদ জন্য প্রতিটি বিভাগ প্রসারিত করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.