MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB:czy możliwe jest przechwytywanie zdarzeń TTL za pomocą Change Stream w celu emulowania harmonogramu (cronjob)?

Udało mi się użyć Change Streams i TTL do emulacji cronjob. Opublikowałem post wyjaśniający szczegółowo, co zrobiłem, i przyznałem kredyty na:https://www. patreon.com/posts/17697287

Ale w zasadzie za każdym razem, gdy muszę zaplanować „wydarzenie” dla dokumentu, kiedy tworzę dokument, równolegle tworzę również dokument zdarzenia. Ten dokument zdarzenia będzie miał jako _id ten sam identyfikator pierwszego dokumentu.

Również dla tego dokumentu wydarzenia ustawię TTL.

Po wygaśnięciu TTL uchwycę jego zmianę „usuwania” za pomocą strumieni zmian. Następnie użyję documentKey zmiany (ponieważ jest to ten sam identyfikator, co dokument, który chcę wyzwolić), aby znaleźć dokument docelowy w pierwszej kolekcji i zrobię z dokumentem wszystko, co zechcę.

Używam Node.js z Express i Mongoose, aby uzyskać dostęp do MongoDB. Oto odpowiednia część do dodania w 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');
        });
    });

}

A oto kod dla modelu/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. Błąd:brak otwartych połączeń w Db._executeQueryCommand Node.js

  2. Jak wczytać dane do Tensorflow?

  3. Jak wykonać surowe operacje mongodb w manguście?

  4. Zarządzanie wieloma technologiami baz danych za pomocą ClusterControl

  5. mongoDB 2.2.1 - baza danych niepoprawna