Change streams

Sigue los cambios de una colección, una base o todo el clúster, en orden de commit.

Los change streams de MongoDB funcionan sobre una colección, una base de datos o todo el clúster. Los eventos salen en orden de commit, con las transacciones juntas, sin pérdidas ni duplicados aunque los rangos se dividan o se fusionen. Lo mismo vale cuando un rango cambia de líder.

Requisitos

  • Un usuario con los privilegios find y changeStream sobre lo que vigilas, sea una colección, una base o el clúster entero.

Abrir el stream

JavaScript
const stream = db.pedidos.watch([{ $match: { operationType: { $in: ["insert", "update"] } } }]);
for await (const cambio of stream) {
  console.log(cambio.operationType, cambio.documentKey);
}

Reanudar

Cada evento lleva un token de reanudación. Si tu aplicación se cae, vuelve a abrir el stream con resumeAfter o startAfter y sigue donde lo dejó. Puedes reanudar mientras el cambio siga en el historial que conserva el clúster: 24 horas por defecto, que cambias con el parámetro teselaHistoryRetention.

JavaScript
db.adminCommand({ setClusterParameter: { teselaHistoryRetention: { seconds: 172800 } } });

Pre-imágenes y post-imágenes

Activa changeStreamPreAndPostImages en la colección y pide fullDocumentBeforeChange o fullDocument: "updateLookup" como en MongoDB. changeStreamOptions.preAndPostImages.expireAfterSeconds limita cuánto tiempo se guardan.

Eventos de DDL y grandes

Los eventos que crean o borran colecciones e índices, y los que los cambian, salen con showExpandedEvents, y un evento que supera 16 MiB se parte con $changeStreamSplitLargeEvent.

Comprobar

Con el stream abierto, inserta un documento en la colección desde otra sesión. El bucle escribe entonces un evento insert.

Problemas frecuentes

  • No puedes reanudar porque el token es más antiguo que el historial que conserva el clúster, 24 horas por defecto. Sube teselaHistoryRetention si tus procesos pueden estar parados más tiempo.

Ver también