mongoose findOne 数组搜索查询返回null问题排查
问题根因
你的查询返回null核心是两个显性错误,附带一个容易踩的类型坑:
- 字段名完全不匹配:你Schema里定义的数组字段叫
list,但查询条件里写的是根本不存在的pending字段,没有任何文档能满足不存在字段的匹配规则,自然返回null。 - Schema定义语法错误:
new mongoose.Schema后面应该跟小括号包裹配置对象,你直接跟了大括号,本身Schema定义就不规范。 - 无类型数组的隐式转换坑:你把数组字段定义为弱类型
Array,如果存的是ObjectId类型的ID,查询时传字符串格式的ID会因为类型不一致匹配失败。
修正方案
- 先修正Schema定义,明确字段名和字段类型:
如果你要查询的用户ID数组字段确实叫pending,就把Schema改成如下格式,不要用无类型的Array定义:
const mongoose = require('mongoose'); const exampleSchema = new mongoose.Schema({ pending: [mongoose.Schema.Types.ObjectId] // 明确数组存储ObjectId类型的用户ID }); // _id是MongoDB默认生成的主键,不需要额外在Schema里声明 const Example = mongoose.model("Example", exampleSchema);
如果你的数组字段实际叫list,就把下面查询条件里的pending换成list,保证字段名和Schema完全一致。
- 修正查询语句,注意类型转换:
查询数组包含单个值不需要用$in或者$elemMatch,直接写字段匹配目标值即可,同时把字符串格式的ID转成ObjectId避免类型不匹配:
const { Types: { ObjectId } } = mongoose; // 正常可用的查询 const friend = await Example.findOne({ _id: new ObjectId(req.body.friendId), pending: new ObjectId(req.body.userId) });
补充说明:
$in是用来匹配字段值命中给定列表中任意一个值的场景,比如要查pending数组包含id1、id2、id3任意一个值的时候才用pending: {$in: [id1, id2, id3]},单值匹配直接传值性能更好;$elemMatch仅用于数组元素是嵌套对象、需要同时匹配对象多个属性的场景,纯值数组不需要用这个操作符。
内容的提问来源于stack exchange,提问作者Bennyh961
相关产品推荐
相关产品推荐

