写入操作(Write Operations)
概述
本页介绍 collection 级别的插入 API。需要 MongoDB 原生写入行为,同时希望使用 monSQLize 的显式缓存失效、统一错误和慢操作监控时,可以使用这些方法。
如果写入必须经过 schema defaults、hooks、timestamps、version、soft delete 或乐观锁,请使用 Model 层。需要在运行时强制这一规则时,配置 写路径策略。
🔵 MongoDB 原生 vs monSQLize 扩展
方法本身: MongoDB 原生 ✅
insertOne()和insertMany()都是 MongoDB 官方支持的标准方法- 所有参数(writeConcern、ordered、comment 等)都是 MongoDB 原生支持
monSQLize 扩展功能: 🔧
- ✅ 显式缓存失效 - 插入后可通过
cache.invalidate或autoInvalidate清理相关缓存 - ✅ 统一错误码 - DUPLICATE_KEY/VALIDATION_ERROR 等统一错误处理
- ✅ 慢查询监控 - 自动记录耗时超过阈值的写入操作
- ✅ 详细日志 - DEBUG/WARN 级别的操作日志
API 参数说明
insertOne()
插入单个文档到集合。
方法签名
参数详解
第一个参数:document(必需)
- 类型:
object - 说明:要插入的文档对象
第二个参数:options(可选)
图例说明:
- ✅ MongoDB 原生: 该参数是 MongoDB 官方支持的标准功能
MongoDB 参考文档:
返回值
insertMany()
一次向集合提交多个文档,减少逐条命令开销。实际吞吐取决于文档结构、索引、写关注、网络和批量大小。
方法签名(insertMany())
参数详解(insertMany())
第一个参数:documents(必需)
- 类型:
object[] - 说明:要插入的文档数组
第二个参数:options(可选)
图例说明:
- ✅ MongoDB 原生: 该参数是 MongoDB 官方支持的标准功能
MongoDB 参考文档:
返回值(insertMany())
使用示例
基本用法
1. 插入单个文档
2. 批量插入文档
高级场景
3. 使用 comment 参数(生产环境日志跟踪)
comment 最佳实践:
4. 使用 writeConcern(关键数据持久化)
writeConcern 选择指南:
5. ordered vs unordered 模式(insertMany)
5.1 ordered 模式(默认)
遇到错误时停止插入,适合需要事务一致性的场景。
5.2 unordered 模式
遇到错误时继续插入其他文档,适合数据导入场景。
模式选择指南:
6. 错误处理
常见错误码:
7. 显式缓存失效
写入成功后,monSQLize 默认不清理查询缓存。需要清理时,在写入 options 里使用 cache.invalidate 精准失效,或使用 autoInvalidate: true 做集合级 broad 失效。缓存失效是写入后的 best-effort 步骤,具体一致性边界见 缓存失效。
可配置失效的缓存操作:
- ✅
find() - ✅
findOne() - ✅
count() - ✅
findPage() - ✅
aggregate() - ✅
distinct()
性能优化
批量插入性能对比
性能建议:
- 批量插入 - 业务和失败语义适合批处理时优先使用
insertMany(),并对选定批量大小做基准测试 - 🚀 批量大小 - 建议每批 100-1000 条,平衡性能和内存
- 🚀 unordered 模式 - 数据导入时使用
ordered: false提高成功率 - 🚀 禁用验证 - 非生产环境可使用
bypassDocumentValidation: true加速
最佳实践
1. 日志跟踪(comment)
2. 写确认级别(writeConcern)
3. 错误处理
4. 批量插入
5. ordered vs unordered
慢查询监控
插入操作耗时超过阈值时,会触发 slow-query 事件:
输出示例:
常见问题
Q: insertMany 和多次 insertOne 有什么区别?
A: 性能差异巨大:
insertMany: 单次网络往返,批量写入,~0.5-1ms/条insertOne(循环调用): 每条文档一条命令,网络往返更多- 性能: 取决于负载;基准记录必须包含数据集、索引、写关注、并发和运行环境
Q: ordered 和 unordered 应该选哪个?
A: 根据场景选择:
- ordered(默认): 事务性操作,需要全成功或全失败
- unordered: 数据导入,允许部分失败
Q: writeConcern 应该如何设置?
A: 根据数据重要性选择:
- 默认(w: 1): 普通数据,性能优先
- 关键数据(w: 'majority', j: true): 金融交易、订单等
Q: 插入后需要手动清理缓存吗?
A: 默认需要你显式配置。使用 cache.invalidate 精准清理,或使用 autoInvalidate: true broad 清理相关缓存。
Q: 如何处理重复键错误?
A: 捕获 DUPLICATE_KEY 错误:
Q: 插入大量数据时内存会不会溢出?
A: 建议分批插入:
参考资料
- 单条插入可运行示例 - 当前 TypeScript 单条插入示例
- 批量插入可运行示例 - 当前 TypeScript 批量插入示例
- 缓存系统 - 缓存失效机制
- 事件系统 - 慢查询监听
- MongoDB writeConcern 文档