Docs Menu

Docs HomeDevelop ApplicationsMongoDB Manual

Change Streams

On this page

  • Availability
  • Connect
  • Watch a Collection, Database, or Deployment
  • Open A Change Stream
  • Modify Change Stream Output
  • Lookup Full Document for Update Operations
  • Resume a Change Stream
  • Use Cases
  • Access Control
  • Event Notification
  • Collation
  • Change Streams and Orphan Documents

Change streams allow applications to access real-time data changes without the complexity and risk of tailing the oplog. Applications can use change streams to subscribe to all data changes on a single collection, a database, or an entire deployment, and immediately react to them. Because change streams use the aggregation framework, applications can also filter for specific changes or transform the notifications at will.

Starting in MongoDB 5.1, change streams are optimized, providing more efficient resource utilization and faster execution of some aggregation pipeline stages.

Change streams are available for replica sets and sharded clusters:

Connections for a change stream can either use DNS seed lists with the +srv connection option or by listing the servers individually in the connection string.

If the driver loses the connection to a change stream or the connection goes down, it attempts to reestablish a connection to the change stream through another node in the cluster that has a matching read preference. If the driver cannot find a node with the correct read preference, it throws an exception.

For more information, see Connection String URI Format.

You can open change streams against:

Target
Description
A collection

You can open a change stream cursor for a single collection (except system collections, or any collections in the admin, local, and config databases).

The examples on this page use the MongoDB drivers to open and work with a change stream cursor for a single collection. See also the mongosh method db.collection.watch().

A database

Starting in MongoDB 4.0, you can open a change stream cursor for a single database (excluding admin, local, and config database) to watch for changes to all its non-system collections.

For the MongoDB driver method, refer to your driver documentation. See also the mongosh method db.watch().

A deployment

Starting in MongoDB 4.0, you can open a change stream cursor for a deployment (either a replica set or a sharded cluster) to watch for changes to all non-system collections across all databases except for admin, local, and config.

For the MongoDB driver method, refer to your driver documentation. See also the mongosh method Mongo.watch().

Note

Change Stream Examples

The examples on this page use the MongoDB drivers to illustrate how to open a change stream cursor for a collection and work with the change stream cursor.

To open a change stream:

  • For a replica set, you can issue the open change stream operation from any of the data-bearing members.

  • For a sharded cluster, you must issue the open change stream operation from the mongos.

The following example opens a change stream for a collection and iterates over the cursor to retrieve the change stream documents. [1]


Use the Select your language drop-down menu in the upper-right to set the language of the examples on this page.


To retrieve the data change event from the cursor, iterate the change stream cursor. For information on the change stream event, see Change Events.

While the connection to the MongoDB deployment remains open, the cursor remains open until one of the following occurs:

  • The cursor is explicitly closed.

  • An invalidate event occurs.

  • If the deployment is a sharded cluster, a shard removal may cause an open change stream cursor to close, and the closed change stream cursor may not be fully resumable.

Note

The lifecycle of an unclosed cursor is language-dependent.

[1] Starting in MongoDB 4.0, you can specify a startAtOperationTime to open the cursor at a particular point in time. If the specified starting point is in the past, it must be in the time range of the oplog.

Use the Select your language drop-down menu in the upper-right to set the language of the examples on this page.


Tip

The _id field of the change stream event document act as the resume token. Do not use the pipeline to modify or remove the change stream event's _id field.

Starting in MongoDB 4.2, change streams will throw an exception if the change stream aggregation pipeline modifies an event's _id field.

See Change Events for more information on the change stream response document format.

By default, change streams only return the delta of fields during the update operation. However, you can configure the change stream to return the most current majority-committed version of the updated document.


Use the Select your language drop-down menu in the upper-right to set the language of the examples on this page.


Note

If there are one or more majority-committed operations that modified the updated document after the update operation but before the lookup, the full document returned may differ significantly from the document at the time of the update operation.

However, the deltas included in the change stream document always correctly describe the watched collection changes that applied to that change stream event.

See Change Events for more information on the change stream response document format.

Change streams are resumable by specifying a resume token to either resumeAfter or startAfter when opening the cursor.

You can resume a change stream after a specific event by passing a resume token to resumeAfter when opening the cursor. For the resume token, use the _id value of the change stream event document. See Resume Tokens for more information on the resume token.

Important

  • The oplog must have enough history to locate the operation associated with the token or the timestamp, if the timestamp is in the past.

  • You cannot use resumeAfter to resume a change stream after an invalidate event (for example, a collection drop or rename) closes the stream. Starting in MongoDB 4.2, you can use startAfter to start a new change stream after an invalidate event.

New in version 4.2.

You can start a new change stream after a specific event by passing a resume token to startAfter when opening the cursor. Unlike resumeAfter, startAfter can resume notifications after an invalidate event by creating a new change stream. For the resume token, use the _id value of the change stream event document. See Resume Tokens for more information on the resume token.

Important

  • The oplog must have enough history to locate the operation associated with the token or the timestamp, if the timestamp is in the past.

The _id value of a change stream event document acts as the resume token:

{
"_data" : <BinData|hex string>
}

Tip

Starting in MongoDB 4.2, change streams will throw an exception if the change stream aggregation pipeline modifies an event's _id field.

The resume token _data type depends on the MongoDB versions and, in some cases, the feature compatibility version (fcv) at the time of the change stream's opening/resumption (i.e. a change in fcv value does not affect the resume tokens for already opened change streams):

MongoDB Version
Feature Compatibility Version
Resume Token _data Type
MongoDB 4.2 and later
"4.2" or "4.0"
Hex-encoded string (v1)
MongoDB 4.0.7 and later
"4.0" or "3.6"
Hex-encoded string (v1)
MongoDB 4.0.6 and earlier
"4.0"
Hex-encoded string (v0)
MongoDB 4.0.6 and earlier
"3.6"
BinData
MongoDB 3.6
"3.6"
BinData

With hex-encoded string resume tokens, you can compare and sort the resume tokens.

Regardless of the fcv value, a 4.0 deployment can use either BinData resume tokens or hex string resume tokens to resume a change stream. As such, a 4.0 deployment can use a resume token from a change stream opened on a collection from a 3.6 deployment.

New resume token formats introduced in a MongoDB version cannot be consumed by earlier MongoDB versions.

Tip

MongoDB provides a "snippet", an extension to mongosh, that decodes hex-encoded resume tokens.

You can install and run the resumetoken snippet from mongosh:

snippet install resumetoken
decodeResumeToken('<RESUME TOKEN>')

You can also run resumetoken from the command line (without using mongosh) if npm is installed on your system:

npx mongodb-resumetoken-decoder <RESUME TOKEN>

See the following for more details on:

Change streams can benefit architectures with reliant business systems, informing downstream systems once data changes are durable. For example, change streams can save time for developers when implementing Extract, Transform, and Load (ETL) services, cross-platform synchronization, collaboration functionality, and notification services.

For deployments enforcing Authentication and authorization:

  • To open a change stream against specific collection, applications must have privileges that grant changeStream and find actions on the corresponding collection.

    { resource: { db: <dbname>, collection: <collection> }, actions: [ "find", "changeStream" ] }
  • To open a change stream on a single databases, applications must have privileges that grant changeStream and find actions on all non-system collections in a database.

    { resource: { db: <dbname>, collection: "" }, actions: [ "find", "changeStream" ] }
  • To open a change stream on an entire deployment, applications must have privileges that grant changeStream and find actions on all non-system collections for all databases in the deployment.

    { resource: { db: "", collection: "" }, actions: [ "find", "changeStream" ] }

Change streams only notify on data changes that have persisted to a majority of data-bearing members in the replica set. This ensures that notifications are triggered only by majority-committed changes that are durable in failure scenarios.

For example, consider a 3-member replica set with a change stream cursor opened against the primary. If a client issues an insert operation, the change stream only notifies the application of the data change once that insert has persisted to a majority of data-bearing members.

If an operation is associated with a transaction, the change event document includes the txnNumber and the lsid.

Starting in MongoDB 4.2, change streams use simple binary comparisons unless an explicit collation is provided. In earlier versions, change streams opened on a single collection (db.collection.watch()) would inherit that collection's default collation.

Starting in MongoDB 5.3, during chunk migration, change stream events are not generated for updates to orphaned documents.

←  Appendix C - OpenSSL Client Certificates for TestingChange Streams Production Recommendations →