ObjectId 自动转换
版本: v1.3.0+
类型: 功能特性
分类: 数据类型处理
📑 目录
概述
从 v1.3.0 版本开始,monSQLize 支持 ObjectId 字符串自动转换 功能。当你在查询条件、更新操作或删除操作中使用 ObjectId 字符串时,monSQLize 会自动将其转换为 MongoDB 的 ObjectId 对象。
核心优势:
- ✅ 简化代码: 无需手动调用
new ObjectId() - ✅ 提升开发效率: 直接使用字符串,代码更简洁
- ✅ 自动识别: 智能判断是否为有效的 ObjectId 字符串
- ✅ 深度转换: 支持嵌套对象和数组中的 ObjectId
- ✅ 安全可控: 支持排除特定字段,防止误转换
为什么需要自动转换
传统方式(v1.3.0 之前)
自动转换方式(v1.3.0+)
转换规则
自动识别条件
monSQLize 会自动将符合以下条件的字符串转换为 ObjectId:
- ✅ 长度为 24 个字符
- ✅ 只包含十六进制字符 (
0-9,a-f,A-F) - ✅ 字段名符合 ObjectId 模式(默认规则)
默认转换字段模式
以下字段名会自动转换:
_id*Id(如userId,postId,categoryId)*_id(如user_id,post_id)*Ids(数组形式,如userIds,postIds)*_ids(数组形式,如user_ids,post_ids)
示例
配置选项
启用/禁用自动转换
配置说明
使用示例
基础查询
复杂查询条件
更新操作
删除操作
支持的方法
ObjectId 自动转换在以下方法中生效:
查询方法
- ✅
find(query) - ✅
findOne(query) - ✅
findOneById(id) - ✅
findByIds(ids) - ✅
findPage(options) - ✅
findAndCount(query) - ✅
count(query) - ✅
distinct(field, query)
写入方法
- ✅
insertOne(doc) - ✅
insertMany(docs) - ✅
updateOne(query, update) - ✅
updateMany(query, update) - ✅
replaceOne(query, doc) - ✅
upsertOne(query, update) - ✅
deleteOne(query) - ✅
deleteMany(query)
批量方法
- ✅
insertBatch(docs) - ✅
updateBatch(query, update) - ✅
deleteBatch(query)
其他方法
- ✅
aggregate(pipeline)(在 $match、$lookup 等阶段) - ✅
findOneAndUpdate(query, update) - ✅
findOneAndDelete(query) - ✅
findOneAndReplace(query, doc)
高级配置
配置选项详解
使用示例
1. 排除特定字段
某些字段虽然符合 ObjectId 格式,但实际上不是 ObjectId:
注意事项:
excludeFields支持点号路径(如metadata.externalId)- 排除优先级高于默认规则和自定义模式
- 建议明确列出所有非 ObjectId 的
*Id字段
2. 自定义字段模式
扩展默认的字段匹配规则:
自定义模式优先级:
excludeFields- 最高优先级(不转换)customFieldPatterns- 自定义模式- 默认模式(
_id,*Id,*Ids)
3. 限制递归深度
防止嵌套过深导致的性能问题:
深度限制说明:
- 默认
maxDepth = 10,适用于绝大多数场景 - 如果数据结构嵌套很深,建议设置较小值(如 5)
- 超过深度限制的字段不会转换,返回原始值
配置验证示例
验证配置是否生效
常见配置场景
场景1:第三方系统集成
场景2:多租户系统
场景3:性能敏感场景
性能考量
性能影响
ObjectId 自动转换对性能的影响非常小:
- 查询条件转换: <1ms(单次查询)
- 文档插入转换: <1ms(单个文档)
- 批量操作转换: 约 0.1ms/文档
优化建议
-
避免过深嵌套
- 建议嵌套深度 ≤ 5 层
- 超过 5 层建议扁平化数据结构
-
合理使用 excludeFields
- 排除明确不是 ObjectId 的字段
- 减少不必要的检查
-
批量操作优先
- 使用
insertBatch而非多次insertOne - 批量操作转换效率更高
- 使用
常见问题
Q1: 如何禁用自动转换?
或者在实例化后修改(不推荐):
Q2: 如何处理混合类型的字段?
有些字段可能既可以是 ObjectId,也可以是普通字符串:
最佳实践:
- 建议数据模型设计时避免混合类型
- 如果无法避免,优先使用
excludeFields+ 手动转换 - 在应用层统一ID格式,减少类型判断
Q3: 自定义字段模式的优先级如何?
优先级从高到低:
-
excludeFields(最高优先级)
- 明确排除的字段,即使匹配自定义模式也不转换
-
customFieldPatterns
- 自定义正则模式,优先于默认规则
-
默认模式(最低优先级)
- 内置的
_id,*Id,*Ids,*_id,*_ids规则
- 内置的
Q3: 自动转换会影响查询性能吗?
不会。ObjectId 转换在查询执行前完成,不影响 MongoDB 查询性能。
转换过程只增加了约 0.1-1ms 的开销,对整体性能影响可以忽略。
Q4: 如何确认某个字段被转换了?
可以通过日志查看:
Q5: 数组中的 ObjectId 会转换吗?
会。包括 $in、$nin 等操作符中的数组:
相关文档
最后更新: 2026-01-08
版本: v1.0.6