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

MongoDB向对象数组添加新对象失败:PUT请求返回null

问题分析与解决方案

核心问题排查

从你提供的控制台输出matchedCount: 2和modifiedCount: 2可以看出,MongoDB已经匹配并修改了2条文档,但数据未按预期正常写入,结合代码与数据库结构,问题集中在以下几点:

1. 使用updateMany导致误操作多文档

你的路由是根据/:id更新单个问题的回答,但updateMany会匹配所有符合id: id条件的文档,控制台显示匹配到2条,说明数据库中存在重复id的文档,违反了id唯一的设计原则。同时,你需要的是给指定id的单个文档添加回答,应使用updateOne而非updateMany。

2. 路由响应的错误写法

代码中response.send(404).send({ msg: "Error occured " })是错误的:send(404)会先发送内容为"404"的200状态响应,后续的send会触发报错,正确的错误响应写法应为response.status(404).send({ msg: "Error occurred" })。

3. 验证数据是否实际写入

控制台的modifiedCount: 2说明MongoDB已执行$push操作,建议直接查看数据库中匹配的文档,确认answers数组是否已新增你提交的回答数据——可能是你误以为未写入,但实际操作已生效。

修正后的代码

数据库操作函数修正

export async function AddAnswer(id, answers) {
    // 用updateOne替代updateMany,确保只修改单个目标文档
    return await client
        .db("StackOvercloned")
        .collection("stackdata")
        .updateOne({ id: id }, { $push: { answers: answers } });
}

路由代码修正

router.put("/:id", async function (request, response) {
    const { id } = request.params;
    const answers = request.body;
    try {
        const newAns = await AddAnswer(id, answers);
        console.log(newAns);
        // 判断是否匹配到目标文档
        if (newAns.matchedCount === 0) {
            return response.status(404).send({ msg: "未找到对应问题" });
        }
        response.send({ newAns });
    } catch (err) {
        // 捕获并返回数据库操作异常
        response.status(500).send({ msg: "操作失败", error: err.message });
    }
});

额外建议

  • 给数据库的id字段添加唯一索引,避免出现重复id的文档,保障数据唯一性。
  • 检查请求中id的类型与数据库中id的类型是否一致(如字符串/数字),避免因类型不匹配导致的匹配失败。

内容的提问来源于stack exchange,提问作者AshVin C K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:50:38