findOneAndReplace() - 原子查找并替换
📑 目录
原子地查找并完整替换单个文档,返回替换前或替换后的文档。
语法
参数
filter (Object, 必需)
筛选条件。
replacement (Object, 必需)
替换文档,不能包含更新操作符。
options (Object, 可选)
返回值
默认返回文档对象或 null(未找到)。
如果 includeResultMetadata: true,返回:
⚠️ 重要提示 - MongoDB 驱动 6.x 兼容性
monSQLize 使用 MongoDB Node.js 驱动 6.x,该版本对
findOneAndReplace的返回值格式进行了重要变更:驱动 6.x (当前版本):
- 默认直接返回文档对象
- 需要显式设置
includeResultMetadata: true才返回完整元数据驱动 5.x 及更早版本:
- 默认返回完整元数据
{ value, ok, lastErrorObject }✅ monSQLize 的处理:
- 已在内部自动处理此差异,用户无需关心驱动版本
- API 行为保持一致,向后兼容
- 详见技术分析报告:
analysis-reports/2025-11-17-mongodb-driver-6x-compatibility.md
核心特性
原子性保证
与 findOneAndUpdate 的区别
常见场景
场景 1: 配置原子替换
场景 2: 版本管理
场景 3: 状态机转换
场景 4: 分布式锁配置
示例
基本用法
返回替换后的文档
使用排序
使用投影
使用 upsert
错误处理
常见错误
错误 1: 使用更新操作符
错误 2: 忘记字段会被删除
性能建议
1. 使用索引
2. 使用投影减少数据传输
并发安全
安全示例
最佳实践
1. 保存历史版本
2. 使用版本号
3. 验证结果
何时使用
✅ 适合使用 findOneAndReplace
- 需要旧值 - 替换前需要查看原文档
- 原子操作 - 防止竞态条件
- 配置管理 - 完整替换配置
- 状态机 - 完整状态切换
❌ 不适合使用 findOneAndReplace
- 部分更新 - 使用
findOneAndUpdate - 不需要旧值 - 使用
replaceOne - 保留字段 - 使用
findOneAndUpdate
相关方法
findOneAndUpdate()- 原子地查找并部分更新replaceOne()- 完整替换单个文档findOne()- 查找单个文档