如何正确使用MongoDB的findOne查询按自定义id获取单条产品数据
问题根源
你遇到的问题核心是查询值和数据库字段的类型不匹配:
- 从URL参数
req.params.id拿到的mid是字符串类型,比如你日志输出的632834528实际是字符串格式 - 数据库中存储的
id字段是数字类型,比如返回结果里的id: 3484是数值格式
MongoDB的查询会严格校验字段类型,字符串和数字不会自动隐式转换,所以你的查询条件{id: mid}实际上匹配不到任何文档。出现返回第一条数据的情况,一般是查询条件未生效时的异常返回,本质还是类型不匹配导致的。
另外你用find查询返回整个数组是正常的:find方法不管匹配结果数量多少,默认都会返回数组,匹配不到是空数组,匹配到多条就返回包含所有对应文档的数组,查询单个对象应该使用findOne。
解决方法
把URL拿到的id转成数字类型再查询即可,修改后的代码如下:
router.get("/:id", async (req, res)=> { // 将字符串格式的id转换为数字类型 const mid = Number(req.params.id); // 增加非法参数校验 if (isNaN(mid)) { return res.status(400).send({message: "无效的产品id"}) } console.log(mid) const product = await Product.findOne({ id: mid }) console.log(product) if (product) { res.send(product); } else { res.status(404).send({message:"product not found"}) } });
内容的提问来源于stack exchange,提问作者nt369
相关产品推荐
相关产品推荐

