如何从MongoDB嵌套对象数组中通过_id获取单个元素
解决Mongoose findById返回null的问题
问题原因
你当前使用的findById(id)是Mongoose专门匹配**文档根级_id**的方法(等价于findOne({_id: id}))。从你提供的find()结果来看,根文档的_id是6384db62827c2f0816944734,而你请求时传入的id大概率是arrayData数组里子对象的_id(比如6384db62827c2f0816944735),所以查询不到对应文档,返回null。
解决方案
根据你的实际需求选择对应的实现方式:
1. 按根文档_id查询完整文档
如果你的目标是获取整个根文档,只需确保请求的id是根级的_id(比如6384db62827c2f0816944734),你当前的路由代码本身没有问题,检查请求参数是否正确即可。
2. 按数组子对象的_id查询对应子项
如果你想根据数组里子对象的_id,获取包含该子项的文档(或仅返回匹配的子元素),需要改用findOne并指定嵌套字段查询条件:
router.get('/users/:id', (req, res) => { const { id } = req.params; userSchema // 匹配arrayData中包含指定_id的文档 .findOne({"arrayData._id": id}, {"arrayData.$": 1}) // 若要返回完整文档,去掉第二个参数 {"arrayData.$": 1} 即可 .then((data) => res.json(data)) .catch((err) => res.json({message: err.message})) })
{"arrayData._id": id}:查询条件,匹配包含指定子对象_id的根文档{"arrayData.$": 1}:投影参数,只返回数组中匹配的那个子元素(如果不需要筛选数组,可省略该参数)
内容的提问来源于stack exchange,提问作者Ranses Canelôn
相关产品推荐
相关产品推荐

