写入操作(Write Operations)
📑 目录
本文档详细介绍 monSQLize 的写入操作 API,包括 insertOne 和 insertMany。
概述
monSQLize 提供两种写入方法:
🔵 MongoDB 原生 vs monSQLize 扩展
方法本身: MongoDB 原生 ✅
insertOne()和insertMany()都是 MongoDB 官方支持的标准方法- 所有参数(writeConcern、ordered、comment 等)都是 MongoDB 原生支持
monSQLize 扩展功能: 🔧
- ✅ 自动缓存失效 - 插入后自动清理相关缓存(monSQLize 独有)
- ✅ 统一错误码 - DUPLICATE_KEY/VALIDATION_ERROR 等统一错误处理
- ✅ 慢查询监控 - 自动记录耗时超过阈值的写入操作
- ✅ 详细日志 - DEBUG/WARN 级别的操作日志
核心特性:
- ✅ 自动缓存失效 🔧 - 插入后自动清理相关缓存(monSQLize 扩展)
- ✅ 写确认级别 ✅ - 支持自定义 writeConcern(MongoDB 原生)
- ✅ 错误处理 🔧 - 统一错误码(monSQLize 扩展)
- ✅ 日志跟踪 ✅ - 支持 comment 参数用于生产环境监控(MongoDB 原生)
- ✅ 慢查询监控 🔧 - 自动记录耗时超过阈值的写入操作(monSQLize 扩展)
API 参数说明
insertOne()
插入单个文档到集合。
方法签名
参数详解
第一个参数:document(必需)
- 类型:
object - 说明:要插入的文档对象
第二个参数:options(可选)
图例说明:
- ✅ MongoDB 原生: 该参数是 MongoDB 官方支持的标准功能
MongoDB 参考文档:
返回值
insertMany()
批量插入多个文档到集合(10-50x 性能提升)。
方法签名
参数详解
第一个参数:documents(必需)
- 类型:
object[] - 说明:要插入的文档数组
第二个参数:options(可选)
图例说明:
- ✅ MongoDB 原生: 该参数是 MongoDB 官方支持的标准功能
MongoDB 参考文档:
返回值
使用示例
基本用法
1. 插入单个文档
2. 批量插入文档
高级场景
3. 使用 comment 参数(生产环境日志跟踪)
comment 最佳实践:
4. 使用 writeConcern(关键数据持久化)
writeConcern 选择指南:
5. ordered vs unordered 模式(insertMany)
5.1 ordered 模式(默认)
遇到错误时停止插入,适合需要事务一致性的场景。
5.2 unordered 模式
遇到错误时继续插入其他文档,适合数据导入场景。
模式选择指南:
6. 错误处理
常见错误码:
7. 自动缓存失效
插入操作会自动清理相关缓存,无需手动调用 invalidate()。
自动失效的缓存操作:
- ✅
find() - ✅
findOne() - ✅
count() - ✅
findPage() - ✅
aggregate() - ✅
distinct()
性能优化
批量插入性能对比
性能建议:
- 🚀 批量插入 - 优先使用
insertMany(),性能提升 10-50 倍 - 🚀 批量大小 - 建议每批 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(循环调用): 多次网络往返,~10-20ms/条- 性能提升: 10-50 倍
Q: ordered 和 unordered 应该选哪个?
A: 根据场景选择:
- ordered(默认): 事务性操作,需要全成功或全失败
- unordered: 数据导入,允许部分失败
Q: writeConcern 应该如何设置?
A: 根据数据重要性选择:
- 默认(w: 1): 普通数据,性能优先
- 关键数据(w: 'majority', j: true): 金融交易、订单等
Q: 插入后需要手动清理缓存吗?
A: 不需要,insertOne 和 insertMany 会自动失效相关缓存。
Q: 如何处理重复键错误?
A: 捕获 DUPLICATE_KEY 错误:
Q: 插入大量数据时内存会不会溢出?
A: 建议分批插入:
参考资料
- examples/docs/insert.ts - 当前 TypeScript 单条插入示例
- examples/docs/insert-many.ts - 当前 TypeScript 批量插入示例
- docs/cache.md - 缓存失效机制
- docs/events.md - 慢查询监听
- MongoDB writeConcern 文档