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
findychangeStreamsobre lo que vigilas, sea una colección, una base o el clúster entero.
Abrir el stream
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.
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
teselaHistoryRetentionsi tus procesos pueden estar parados más tiempo.