watch()(监听集合变更)
最后更新:2026-10-09
watch()(监听集合变更)
watch()监听集合的变更并返回变更流(Change Stream),例如`db.users.watch([{ $match: { 'operationType': 'insert' } }])`。每次文档插入、更新、删除、替换都会产生变更事件。它只支持副本集和分片集群,单机standalone无法使用。常用于实时数据同步、缓存失效、审计日志等场景。
| 分类 | 索引与管理 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
db.<集合>.watch(<管道数组>, { fullDocument: 'updateLookup' })
⚙️ 参数
| 管道数组 | 可选。对变更事件的聚合管道,用于过滤事件。 |
|---|---|
| fullDocument | 可选。'updateLookup'让更新事件附带文档完整内容。 |
返回值:Change Stream游标,可遍历或监听变更事件。
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// watch:监听users集合的插入事件
const stream = db.users.watch([
{ $match: { 'operationType': 'insert' } }
])
stream.forEach(ev => print('新用户: ' + ev.fullDocument.name))
运行结果:
新用户: Alice
新用户: Bob
📌 注意事项
- 只支持副本集和分片集群,standalone不可用
- 变更事件在服务器端持久化于oplog
- 处理逻辑应可重入,防止事件重复消费
🏷️ 相关标签
💡 相关案例
📚 相关教程
❓ 常见问题
Qwatch在单机MongoDB能用吗?
A不能,watch()要求副本集或分片集群环境,单机部署会报错。
Qwatch能只监听插入事件吗?
A可以,用管道过滤:db.users.watch([{$match: {'operationType': 'insert'}}])。
Qwatch适合什么场景?
A实时数据同步、缓存失效、审计日志、事件驱动的业务流程等需要感知数据变化的场景。