MongoDB增删改查接口忽略传入ID、错误操作首条记录问题求助
问题根本原因
- MongoDB默认主键字段为
_id,代码中所有查询条件使用的id是不存在的字段 - ID参数放在URL路由路径中,需要通过
req.params.id获取,代码中使用req.body.id无法取到对应值,实际查询条件为{id: undefined},MongoDB会匹配全量文档,每次默认操作第一条记录,就会出现依次删除/修改的现象 - MongoDB默认生成的
_id为ObjectId类型,直接使用字符串查询无法匹配,需要先做类型转换
修正方案
首先在代码顶部引入MongoDB的ObjectId工具:
const { ObjectId } = require('mongodb');
对应路由修正如下:
单条查询路由
routes.route("/techs/:id").get((req, res) => { let db_connect = dbo.getDb("employees"); var myquery = { _id: ObjectId(req.params.id) }; db_connect .collection("techs") .findOne(myquery, function (err, result) { if (err) throw err; res.json(result); }); });
更新路由
routes.route("/update/:id").put(function (req, res) { let db_connect = dbo.getDb("employees"); let myquery = { _id: ObjectId(req.params.id) }; let newvalues = { $set: { name: req.body.name, title: req.body.title }, }; db_connect .collection("techs") .updateOne(myquery, newvalues, function (err, result) { if (err) throw err; console.log("1 document updated"); res.json({ status: "success" }); }); });
删除路由
routes.route("/:id").delete((req, res) => { let db_connect = dbo.getDb("employees"); var myquery = { _id: ObjectId(req.params.id) }; db_connect.collection("techs").deleteOne(myquery, function (err, obj) { if (err) throw err; console.log("1 document deleted"); res.json({ status: "success" }); }); });
注意事项
所有数据库操作完成后需要返回响应给客户端,否则请求会一直处于挂起状态最终超时。如果你自定义了id作为业务主键,不需要使用_id的情况下,可以去掉ObjectId转换,仅调整参数获取来源为req.params.id即可。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

