MongoDB通过分类ID查询Pet数据返回空数组问题求助
问题排查与解决方案
- 首先解决最常见的类型不匹配问题
你从req.params.id拿到的是字符串类型,但MongoDB中存储的category._id默认是ObjectId类型,两者类型不同导致相等判断失败,自然查不到数据。修改查询代码手动转类型即可:
// 注意使用new ObjectId()前要确保你已经从mongoose或者mongodb包中引入了ObjectId构造函数 const pets = await Pet.find({ 'category._id': new ObjectId(id) }).sort('-createdAt');
- 修复不存在数据的判断逻辑
Mongoose的find方法永远返回数组,没有匹配数据时返回空数组,而空数组的布尔值为true,所以你写的if (!pets)判断永远不会触发,要改成判断数组长度:
if (pets.length === 0) { res.status(404).json({ msg: 'Pets not found!' }); return; }
- 优化Pet模型的字段定义
你现在把category定义为无结构的Object类型,Mongoose不会自动做内部字段的类型转换,建议显式定义category的结构,避免后续其他查询异常:
// 替换原来的category: Object写法 category: { _id: mongoose.Schema.Types.ObjectId, // 其他category包含的字段也一起列出来,比如name之类的 name: String },
- 验证数据库中是否存在对应数据
先直接在MongoDB shell中执行查询语句,确认库里确实存在符合条件的记录:
# 把尖括号内容替换成你要查询的分类ID db.pets.find({"category._id": ObjectId("<你的分类ID>")})
如果执行上面的语句也返回空,说明是数据存储环节的问题,检查你新增宠物数据时是否正确存储了category._id字段。
内容的提问来源于stack exchange,提问作者guilherme augusto
相关产品推荐
相关产品推荐

