You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB增删改查接口忽略传入ID、错误操作首条记录问题求助

问题根本原因

  1. MongoDB默认主键字段为_id,代码中所有查询条件使用的id是不存在的字段
  2. ID参数放在URL路由路径中,需要通过req.params.id获取,代码中使用req.body.id无法取到对应值,实际查询条件为{id: undefined},MongoDB会匹配全量文档,每次默认操作第一条记录,就会出现依次删除/修改的现象
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:39:03