Sling Academy
Home/MongoDB/Working with Change Streams in MongoDB (with examples)

Working with Change Streams in MongoDB (with examples)

Last updated: February 03, 2024

Introduction

Change Streams in MongoDB provide a real-time data change tracking mechanism, enabling applications to react to data changes in the database. This powerful feature allows developers to build responsive and robust applications that can synchronize with their database. In this tutorial, we will cover the basics to advanced concepts of using Change Streams in MongoDB.

Setting Up The Environment

Before we start, ensure you have the following prerequisites set up:

  • MongoDB version 3.6 or higher
  • A collection to watch for changes

Getting Started with Change Streams

Change Streams leverage the aggregation framework of MongoDB to provide a continuous stream of change events for a collection. Let’s start with a simple example to listen for all changes in a collection.

const { MongoClient } = require('mongodb');

async function main() {
  const client = new MongoClient('mongodb://localhost:27017');
  await client.connect();
  const db = client.db('yourDatabase');
  const collection = db.collection('yourCollection');

  const changeStream = collection.watch();

  changeStream.on('change', (change) => {
    console.log(change);
  });
}

main();

Running the above script in a Node.js environment will start printing out all change events for ‘yourCollection’ in the ‘yourDatabase’ database.

Filtering Change Events

Sometimes you only want to listen for specific types of changes. Let’s enhance our change stream to only track insert operations.

const changeStream = collection.watch([
  { $match: { 'operationType': 'insert' } }
]);

With this pipeline in place, the change stream will now only report ‘insert’ operations.

Handling Change Events in Production

In production, resilience is key. You will need to handle errors and network issues gracefully. The following example shows you how to use try-catch blocks and handle a closed change stream.

changeStream.on('change', (change) => {
  try {
    // Handle change event
    console.log(change);
  } catch (error) {
    console.error('Error handling change event: ', error);
  }
});

changeStream.on('close', () => {
  console.log('Change Stream closed unexpectedly');
});

Advanced Use Cases

As your familiarity with Change Streams grows, you might be interested in more complex tasks, such as watching multiple collections or handling large traffic. Here is a short snippet to showcase watching changes across multiple collections.

const changeStream = db.watch([], { allChangesForCluster: true });

This change stream will now emit events from all collections in the database.

Resume Tokens and Checkpointing

Change Streams in MongoDB provide resume tokens that enable the client to resume the stream from a specific point in time. A practical approach is to persist these tokens to handle app restarts without losing the context of the change stream.

changeStream.on('change', (change) => {
  console.log(change);
  // Persist change._id (the resume token) to a safe storage
});

Performing Administrative Tasks

Managing the change stream means knowing how to end it when it’s no longer needed. You can call the close() method to stop listening for new change events.

changeStream.close();

Notes

  • Access Control: It’s necessary to be mindful about security, particularly for data stream access. Ensure that the MongoDB user has the necessary privileges to execute a watch operation on the desired database or collection.
  • Performance Considerations: Though Change Streams are designed to be efficient, every operation has a cost. Index your collection appropriately, and choose the pipeline stages to minimize the unnecessary load on the server.
  • Scaling with Change Streams: For applications needing to scale horizontally, MongoDB supports change streams on replica sets and sharded clusters. Leveraging MongoDB’s scalability features in combination with change streams can help your applications maintain high performance and availability.
  • Integrating with Other Services: Change Streams can be integrated with various messaging systems like Kafka, or services like AWS Lambda, to further process the change events and react in real time.

Conclusion

In this tutorial, we covered how to work with MongoDB Change Streams from basic usage to more advanced techniques. By leveraging change streams, your applications can react to database changes in real time, opening up possibilities for real-time analytics, triggers, and more. Remember to manage resources carefully and handle errors to ensure a robust implementation.

Next Article: Understanding Transactions in MongoDB (with examples)

Previous Article: MongoDB createdAt and updatedAt fields: A practical guide (with examples)

Series: MongoDB Tutorials

MongoDB

You May Also Like

  • MongoDB: How to combine data from 2 collections into one
  • Hashed Indexes in MongoDB: A Practical Guide
  • Partitioning and Sharding in MongoDB: A Practical Guide (with Examples)
  • Geospatial Indexes in MongoDB: How to Speed Up Geospatial Queries
  • Understanding Partial Indexes in MongoDB
  • Exploring Sparse Indexes in MongoDB (with Examples)
  • Using Wildcard Indexes in MongoDB: An In-Depth Guide
  • Matching binary values in MongoDB: A practical guide (with examples)
  • Understanding $slice operator in MongoDB (with examples)
  • Caching in MongoDB: A practical guide (with examples)
  • CannotReuseObject Error: Attempted illegal reuse of a Mongo object in the same process space
  • How to perform cascade deletion in MongoDB (with examples)
  • MongoDB: Using $not and $nor operators to negate a query
  • MongoDB: Find SUM/MIN/MAX/AVG of each group in a collection
  • References (Manual Linking) in MongoDB: A Developer’s Guide (with Examples)
  • MongoDB: How to see all fields in a collection (with examples)
  • Type checking in MongoDB: A practical guide (with examples)
  • How to query an array of subdocuments in MongoDB (with examples)
  • MongoDB: How to compare 2 documents (with examples)