findByIds() - 批量通过 _id 查询多个文档
📑 目录
方法概述
findByIds 是一个便利方法,用于批量通过 _id 数组查询多个文档,简化了 find({ _id: { $in: ids } }) 的使用。
为什么需要 findByIds?
传统方式(使用 find):
使用 findByIds:
核心优势
方法签名
参数说明
返回值说明
返回文档数组,不存在的 ID 不会返回结果。
基础示例
示例 1:批量查询文档(字符串 ID)
示例 2:批量查询文档(ObjectId)
示例 3:混合类型(字符串 + ObjectId)
示例 4:使用 projection(只返回特定字段)
示例 5:使用 sort(排序结果)
示例 6:保持原始顺序
真实场景示例
场景 1:批量查询用户资料(关联查询)
从评论列表中提取用户 ID,批量查询用户资料。
场景 2:批量权限验证
检查多个用户是否有特定权限。
场景 3:批量数据导出(保持顺序)
按指定顺序导出用户数据。
场景 4:批量数据预加载(缓存)
预加载热门用户数据到缓存。
场景 5:批量好友信息查询
查询用户的所有好友信息。
场景 6:批量通知发送
根据用户 ID 列表批量发送通知。
选项参数详解
projection - 字段投影
只返回需要的字段,减少数据传输量。
sort - 排序
对结果进行排序。
cache - 缓存
缓存查询结果,加速重复查询。
maxTimeMS - 查询超时
限制查询最大执行时间。
comment - 查询注释
用于日志追踪和性能分析。
preserveOrder - 保持顺序
结果顺序与输入 ids 数组一致。
性能说明
性能对比
性能优化建议
-
使用 projection 减少数据量
-
启用缓存加速重复查询
-
避免过大的 ID 数组
错误处理
错误类型
错误处理示例
最佳实践
✅ 推荐做法
-
使用 findByIds 替代循环查询
-
自动去重,无需手动处理
-
检查缺失的 ID
❌ 避免的做法
-
避免过大的 ID 数组
-
避免重复查询
与其他方法对比
vs findOneById
vs find({ _id: { $in }})
常见问题
Q1: findByIds 和 find 有什么区别?
A: findByIds 是 find({ _id: { $in: ids } }) 的便利方法:
- ✅ 自动转换 ObjectId(字符串 → ObjectId)
- ✅ 自动去重(重复 ID 只查询一次)
- ✅ 更简洁的 API
Q2: 如何处理不存在的 ID?
A: findByIds 只返回存在的文档,不存在的 ID 不会返回结果。
Q3: 支持多少个 ID?
A: 理论上没有限制,但建议:
- 单次查询 ≤ 1000 个 ID(性能最优)
- 超过 1000 个建议分批查询
Q4: preserveOrder 选项有性能影响吗?
A: 有轻微影响(需要重新排序),但通常可以忽略:
- 无 preserveOrder: O(n)
- 有 preserveOrder: O(n log n)
Q5: 会自动去重吗?
A: ✅ 是的!重复的 ID 只会查询一次。
Q6: 支持缓存吗?
A: ✅ 支持!使用 cache 选项。
Q7: 性能如何?
A: 性能优秀:
- 有索引:10-20ms(查询 100 个)
- 无索引:50-100ms(全表扫描)
优化建议: _id 字段默认有索引,无需额外创建。
另请参阅
- findOneById() - 通过 _id 查询单个文档
- find() - 基础查询方法
- findOne() - 查询单个文档
- MongoDB 官方文档:$in 操作符