Mongoose按子级ObjectId查询文档的正确实现语法
Mongoose ObjectId类型关联字段查询匹配解决方案
问题现象
使用model.find()查询文档时,Schema中定义的普通类型字段都可以正常匹配,唯独类型为mongoose.Schema.ObjectId的关联字段(比如文档所有者关联字段)无法正常命中查询结果。
正确实现方式
1. Schema定义参考
const Schema = new mongoose.Schema({ type: Object, owner: { type: mongoose.Schema.ObjectId, ref: 'User', required: [ true, 'car must belong to an owner' ] }, name: String });
2. 查询代码
适配Mongoose 5.12及以上版本
Mongoose高版本会自动将字符串格式的用户id转为ObjectId类型匹配,直接传入即可:
const users_cars = await Cars.find( { owner: user_id } );
适配Mongoose低版本
低版本不会自动做类型转换,需要手动将字符串id转为ObjectId类型再查询:
const users_cars = await Cars.find( { owner: mongoose.Types.ObjectId(user_id) } );
常见问题排查点
- 确认传入的
user_id是24位合法十六进制字符串,格式错误会导致类型转换失败 - 确认Schema中关联字段的类型定义为
mongoose.Schema.ObjectId,不要误定义为String类型 - 确认目标集合中存在对应关联字段值匹配的文档,排除数据不存在的情况
内容的提问来源于stack exchange,提问作者nothing special
相关产品推荐
相关产品推荐

