Change stream cho phép ứng dụng lắng nghe thay đổi dữ liệu (insert/update/delete) theo thời gian thực mà không cần polling.
Nó đọc từ oplog của replica set, nên chỉ chạy được trên replica set hoặc sharded cluster, không chạy trên standalone.
js
const stream = db.collection('orders').watch([
{ $match: { 'fullDocument.status': 'paid' } }
], { fullDocument: 'updateLookup' })
for await (const change of stream) {
await sendInvoice(change.fullDocument)
}Các việc hay dùng: đẩy thông báo real-time, đồng bộ sang Elasticsearch/cache, ghi audit log, kích hoạt job nền khi đơn chuyển trạng thái.
Hai điểm phải nhớ khi dùng thật:
- Mặc định event update chỉ chứa phần thay đổi, muốn cả document phải bật fullDocument: 'updateLookup'.
- Mỗi event có _id là resume token. Lưu lại token đã xử lý để khi service restart thì resumeAfter từ đó, không mất event — miễn là oplog chưa bị ghi đè.