insertBatch - 分批批量插入(支持自动重试)
📑 目录
insertBatch 方法提供自动分批插入大量文档的功能,支持失败重试、进度监控等高级特性,避免内存溢出和网络超时问题。
概述
当需要插入大量数据(如数万或数十万条)时,直接使用 insertMany 可能导致:
- 内存溢出 - 一次性加载过多数据
- 网络超时 - 单次请求时间过长
- 难以监控 - 无法追踪插入进度
insertBatch 通过自动分批、进度监控、错误处理、自动重试等特性解决这些问题。
API 参数说明
方法签名
参数详解
第一个参数:documents(必需)
- 类型:
object[] - 说明:要插入的文档数组
第二个参数:options(可选)
返回值
进度回调参数
使用示例
1. 基础用法 - 自动分批插入
2. 进度监控
3. 自动重试机制 ⭐ 新特性
3.1 retry 策略 - 失败自动重试
4. 错误处理策略对比
4.1 stop 策略(默认)- 遇错停止
4.2 skip 策略 - 跳过失败批次
4.3 collect 策略 - 收集所有错误
5. 并发插入(加速大数据导入)
6. 结合 comment 参数(生产环境)
错误处理策略对比
策略选择指南
性能优化建议
1. 批次大小(batchSize)
选择指南:
- 小文档 (< 1KB):
batchSize: 1000-2000 - 中文档 (1-10KB):
batchSize: 500-1000 - 大文档 (> 10KB):
batchSize: 100-500
2. 并发控制(concurrency)
3. 重试策略配置
常见问题
Q: insertBatch vs insertMany 如何选择?
A: 根据数据量选择:
- < 5K 条: 使用
insertMany(更简单) - 5K-50K 条: 使用
insertBatch(更安全) - > 50K 条: 必须使用
insertBatch(避免超时)
Q: batchSize 如何设置?
A: 考虑以下因素:
- 文档大小: 文档越大,
batchSize越小 - 网络速度: 网络越慢,
batchSize越小 - 数据库性能: 数据库越弱,
batchSize越小 - 推荐起点: 先用
1000,根据实际情况调整
Q: 重试机制什么时候用?
A: 以下场景适合使用重试:
- ✅ 网络不稳定(WiFi、移动网络)
- ✅ 数据库负载高(临时连接失败)
- ✅ 锁冲突(等待后可能成功)
- ❌ 数据错误(重试也不会成功)
- ❌ 权限问题(重试也不会成功)
Q: 并发会不会导致数据不一致?
A: 不会。insertBatch 确保:
- 每个批次独立插入
insertedIds按原始顺序映射- 错误处理与批次关联
- 缓存自动失效
Q: 如何处理部分失败的情况?
A: 使用 collect 或 retry 策略:
参考资料
- examples/docs/batch-operations.ts - 当前 TypeScript 示例
- test/unit/writes/batch.test.ts - 测试用例
- docs/write-operations.md - 写入操作总览
- docs/cache.md - 缓存失效机制
- docs/insertBatch-improvements.md - 进一步改进建议