findOneAnd* 方法返回值统一说明
文档版本: 当前 main / unreleased 最后更新: 2026-06-10 适用版本: monSQLize v2.0.2+
📑 目录
📋 概述
本文档详细说明 monSQLize 如何统一处理不同 MongoDB Driver 版本中 findOneAndUpdate、findOneAndReplace、findOneAndDelete 方法的返回值差异。
❓ 问题背景
MongoDB Driver 版本差异
在 MongoDB Node.js Driver 的不同版本中,findOneAnd* 方法的返回值格式存在重大差异。当前 monSQLize 默认随包安装 mongodb@6.21.0;Driver 7.2.0 作为扩展矩阵验证版本。
Driver 4.x 返回格式
Driver 5.x 返回格式
Driver 6.x / 7.x 默认返回格式
问题
如果直接使用 MongoDB Driver,用户代码需要根据版本处理不同的返回值:
✅ monSQLize 的解决方案
默认依赖统一用户体验
monSQLize 默认随包安装 mongodb@6.21.0,并验证 Driver 7.2.0 扩展矩阵。使用默认安装时,findOneAnd* 直接返回文档或 null,用户无需额外安装或选择 driver 版本。
🔧 实现原理
Driver 薄封装
monSQLize 在 src/adapters/mongodb/writes/write-basic.ts 中调用 MongoDB Driver 原生方法,并保持当前 driver 基线的默认返回形态:
验证边界
mongodb@6.21.0是默认运行时基线。- Driver 7.2.0 通过兼容性矩阵作为扩展验证。
- Driver 4.x / 5.x 的
{ value, ok, lastErrorObject }是历史迁移背景,不建议在新项目覆盖默认依赖。
📊 适用的方法
monSQLize 对以下 3 个方法统一了返回值:
1. findOneAndUpdate ✅
2. findOneAndReplace ✅
3. findOneAndDelete ✅
🎯 用户体验对比
❌ 使用原生 Driver(需要手动处理)
✅ 使用 monSQLize(自动处理)
🧪 测试验证
测试覆盖
monSQLize 通过当前兼容性矩阵验证默认 driver 基线和扩展 driver:
运行测试
💡 最佳实践
1. 使用 monSQLize 无需修改代码
2. 避免在应用中覆盖默认 Driver
3. 处理不存在的情况
🎉 总结
✅ monSQLize 的优势
-
默认安装即统一体验
- 默认 Driver 基线返回文档或
null - 用户无需手动提取
value - 代码更简洁清晰
- 默认 Driver 基线返回文档或
-
版本升级有验证入口
- 兼容性矩阵覆盖
mongodb@6.21.0与 Driver 7.2.0 - 用户代码无需为默认安装增加版本判断
- 新主版本升级前先跑矩阵验证
- 兼容性矩阵覆盖
-
完整测试覆盖
- 测试当前默认 driver 与扩展 driver
- 验证所有
findOneAnd*方法 - 验证结果记录在
test/validation/
-
开发效率提升
- 减少 30-50% 代码量
- 避免版本判断逻辑
- 更专注业务逻辑
📚 相关文档
- 📖 MongoDB Driver 兼容性指南
- 📖 兼容性矩阵配置
- 📖 验证进度
结论: 使用 monSQLize 默认安装时,findOneAnd* 方法返回文档或 null,用户不需要额外安装 driver,也不需要手动处理 result.value。