使用array.find()查找MongoDB子文档返回undefined问题排查
问题原因及解决方案
你遇到的核心问题是:MongoDB的ObjectId对象不能用===直接比较。
虽然你已经把offerID转换成了ObjectId类型,且typeof检查显示两者类型一致,但===在比较对象时是引用比较——el._id和offerIDObject是两个独立的ObjectId实例,哪怕它们存储的ID值完全相同,===也会返回false,导致find方法找不到匹配项,最终返回undefined。
解决方法
有两种可靠的方式来比较ObjectId:
- 使用ObjectId内置的
equals()方法(推荐,这是MongoDB官方设计的比较方式):const offer = offers.find((el) => { return el._id.equals(offerIDObject) }) - 将ObjectId转为字符串后比较:
const offer = offers.find((el) => { return el._id.toString() === offerIDObject.toString() })
验证逻辑
你可以在map里加入值比较的验证,直观看到差异:
offers.map((el, i) => { console.log(`索引${i} - 类型一致:`, typeof(el._id) === typeof(offerIDObject)) console.log(`索引${i} - 值相等(equals方法):`, el._id.equals(offerIDObject)) console.log(`索引${i} - 值相等(转字符串):`, el._id.toString() === offerIDObject.toString()) })
内容的提问来源于stack exchange,提问作者Fun Strike
相关产品推荐
相关产品推荐

