updateBatch - 批量更新文档
📑 目录
概述
updateBatch 方法通过流式查询分批更新大量文档,适用于需要更新成千上万甚至百万级数据的场景,避免一次性更新造成的内存压力和性能问题。
特点
- ✅ 流式查询 - 基于
find()的流式API,恒定内存占用 - ✅ 进度监控 - 实时查看更新进度和百分比
- ✅ 错误处理 - 支持 stop/skip/collect/retry 四种策略
- ✅ 自动重试 - 网络不稳定时自动重试失败批次
- ✅ 缓存失效 - 自动失效相关集合缓存
- ✅ 全操作符 - 支持所有 MongoDB 更新操作符
适用场景
API 参数说明
方法签名
参数详解
第一个参数:filter(必需)
- 类型:
object - 说明:更新条件,与
updateMany相同
第二个参数:update(必需)
- 类型:
object - 说明:更新操作,必须使用更新操作符(
$set,$inc,$push等) - ❌ 错误:
{ name: 'new' } - ✅ 正确:
{ $set: { name: 'new' } }
第三个参数:options(可选)
返回值
进度回调参数
使用示例
1. 基础用法 - 批量修改状态
2. 带进度监控 - 数据迁移
输出示例:
3. $set - 设置字段值
4. $inc - 增减数值
5. $push - 添加数组元素
6. $pull - 删除数组元素
7. $mul - 乘法运算
8. 多个操作符组合
9. 使用 arrayFilters - 更新数组中的特定元素
10. 错误处理 - retry 策略(推荐)
11. upsert - 不存在则插入
12. 复杂查询条件
性能优化建议
1. 批次大小选择
2. 索引优化
3. 避免全表扫描
4. 更新操作优化
常见问题
Q1: updateBatch 和 updateMany 有什么区别?
建议:
- 数据量 < 10000 条 → 使用
updateMany - 数据量 ≥ 10000 条 → 使用
updateBatch
Q2: updateBatch 会造成数据不一致吗?
答: 否。updateBatch 使用 MongoDB 的游标快照隔离,保证数据一致性。
Q3: 为什么必须使用更新操作符?
答: 这是 MongoDB 的要求,updateMany 也是如此。
Q4: 如何批量更新 _id?
答: 不推荐更新 _id。如果必须,请使用 replaceOne 或重新插入。
Q5: updateBatch 支持哪些更新操作符?
答: 支持所有 MongoDB 更新操作符。
字段操作符:
$set- 设置字段值$unset- 删除字段$rename- 重命名字段$setOnInsert- upsert 时设置(仅插入时)
数值操作符:
$inc- 增减$mul- 乘法$min- 取最小值$max- 取最大值
数组操作符:
$push- 添加元素$pop- 删除首/尾元素$pull- 删除匹配元素$pullAll- 删除多个元素$addToSet- 添加唯一元素
其他操作符:
$currentDate- 设置当前日期
Q6: 如何估算更新时间?
Q7: 可以在事务中使用吗?
答: 可以。
参考资料
- deleteBatch - 批量删除文档
- insertBatch - 批量插入文档
- find - 流式查询
- updateMany - 批量更新(小数据量)
- MongoDB 更新操作符
- 使用示例
- Batch 写入测试
更新日期: 2025-12-30
版本: v1.0