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

MongoDB:apakah mungkin untuk menangkap acara TTL dengan Change Stream untuk meniru penjadwal (cronjob)?

Saya dapat menggunakan Change Streams dan TTL untuk meniru cronjob. Saya telah menerbitkan posting yang menjelaskan apa yang saya lakukan secara detail dan memberikan kredit di:https://www. patreon.com/posts/17697287

Tapi, pada dasarnya, kapan pun saya perlu menjadwalkan "acara" untuk sebuah dokumen, ketika saya membuat dokumen, saya juga membuat dokumen acara secara paralel. Dokumen acara ini akan memiliki _id yang sama dengan id dokumen pertama.

Juga, untuk dokumen acara ini saya akan mengatur TTL.

Ketika TTL kedaluwarsa, saya akan menangkap perubahan "hapus" dengan Change Streams. Dan kemudian saya akan menggunakan documentKey dari perubahan (karena itu adalah id yang sama dengan dokumen yang ingin saya picu) untuk menemukan dokumen target dalam koleksi pertama, dan melakukan apapun yang saya inginkan dengan dokumen tersebut.

Saya menggunakan Node.js dengan Express dan Mongoose untuk mengakses MongoDB. Berikut adalah bagian yang relevan untuk ditambahkan di App.js:

const { ReplSet } = require('mongodb-topology-manager');

run().catch(error => console.error(error));

async function run() {
    console.log(new Date(), 'start');
    const bind_ip = 'localhost';
    // Starts a 3-node replica set on ports 31000, 31001, 31002, replica set
    // name is "rs0".
    const replSet = new ReplSet('mongod', [
        { options: { port: 31000, dbpath: `${__dirname}/data/db/31000`, bind_ip } },
        { options: { port: 31001, dbpath: `${__dirname}/data/db/31001`, bind_ip } },
        { options: { port: 31002, dbpath: `${__dirname}/data/db/31002`, bind_ip } }
    ], { replSet: 'rs0' });

    // Initialize the replica set
    await replSet.purge();
    await replSet.start();
    console.log(new Date(), 'Replica set started...');

    // Connect to the replica set
    const uri = 'mongodb://localhost:31000,localhost:31001,localhost:31002/' + 'test?replicaSet=rs0';
    await mongoose.connect(uri);
    var db = mongoose.connection;
    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', function () {
        console.log("Connected correctly to server");
    });

    // To work around "MongoError: cannot open $changeStream for non-existent database: test" for this example
    await mongoose.connection.createCollection('test');

    // *** we will add our scheduler here *** //

    var Item = require('./models/item');
    var ItemExpiredEvent = require('./models/scheduledWithin');

    let deleteOps = {
      $match: {
          operationType: "delete" 
      }
    };

    ItemExpiredEvent.watch([deleteOps]).
        on('change', data => {
            // *** treat the event here *** //
            console.log(new Date(), data.documentKey);
            Item.findById(data.documentKey, function(err, item) {
                console.log(item);
            });
        });

    // The TTL set in ItemExpiredEvent will trigger the change stream handler above
    console.log(new Date(), 'Inserting item');
    Item.create({foo:"foo", bar: "bar"}, function(err, cupom) {
        ItemExpiredEvent.create({_id : item._id}, function(err, event) {
            if (err) console.log("error: " + err);
            console.log('event inserted');
        });
    });

}

Dan ini kode untuk model/ScheduledWithin:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ScheduledWithin = new Schema({
    _id: mongoose.Schema.Types.ObjectId,
}, {timestamps: true}); 
// timestamps: true will automatically create a "createdAt" Date field

ScheduledWithin.index({createdAt: 1}, {expireAfterSeconds: 90});

module.exports = mongoose.model('ScheduledWithin', ScheduledWithin);


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Pencetakan output yang cantik di pymongo

  2. Perbarui dokumen PyMongo dengan banyak catatan

  3. Apakah kerangka Agregasi Mongodb lebih cepat dari peta/kurangi?

  4. SocketTimeout dengan koneksi terbuka di MongoDB

  5. Luwak pilih bidang subdoc