Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongodb change stream with pipeline using mongoose

I'm attempting to listen for changes in my mongodb cluster, using change streams; however after following several tutorials, my final implementation using mongoose doesn't work. How can I use the current mongoose connection to listen for changes in the database

mongoose connection:

mongoose
.connect(db, {
    useNewUrlParser: true,
    useFindAndModify: false,
    useUnifiedTopology: true
    // useCreateIndex: true
})
.then(() => {
    console.log("Connected to MongoDB...");
})
.catch(err => {
    console.log(err);
});

Change stream:

const pipeline = { 
  $match: {
    $or: [{ operationType: 'insert' },{ operationType: 'update' }], 
    'fullDocument.institution': uniId 
  } 
};

const changeStream = Post.watch([pipeline], {fullDocument: 'updateLookup'});

changeStream.on("change", next => {
        switch(next.operationType) {
          case 'insert':
            console.log('an insert happened...', "uni_ID: ", next.fullDocument.institution);
            let rooms = Object.keys(socket.rooms);
            console.log("rooms: ", rooms);

            nmsps.emit('insert', {
              type: 'insert',
              msg: 'New question available',
              newPost: next.fullDocument
            });
            break;

          case 'update':
            console.log('an update happened...');

            nmsps.emit('update', {
              type: 'update',
              postId: next.documentKey._id,
              updateInfo: next.updateDescription.updatedFields,
              msg: "Question has been updated."
            });
            break;

          case 'delete':
            console.log('a delete happened...');

            nmsps.emit('delete', {
              type: 'delete',
              deletedId: next.documentKey._id,
              msg: 'Question has been deleted.'
            });
            break;

          default:
            break;
       }
 })
like image 359
williamcodes Avatar asked Oct 16 '25 16:10

williamcodes


1 Answers

Because mongoose is using mongodb driver as the core module, you can use mongodb client to watch the change stream.

After connected:

const client = mongoose.connection.client;
const db = client.db('dbName');
const collection = db.collection('collectionName');
const changeStream = collection.watch();
changeStream.on('change', next => {
    
});
like image 83
chuong2v Avatar answered Oct 18 '25 05:10

chuong2v



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!