更新 mongoDB 中的单个项目,同时保持其余项目相同

Posted

技术标签:

【中文标题】更新 mongoDB 中的单个项目,同时保持其余项目相同【英文标题】:Updating a single item in mongoDB whilst keeping the rest the same 【发布时间】:2020-11-21 16:52:39 【问题描述】:

我正在使用一个 mongoDB,其中每个对象(我认为这是一行)大约有 30 个项目(我认为这些项目是列),我想使用更新函数,以便每个对象中只有一个项目在调用时更新,同时保持其余部分相同。下面是我正在使用的代码。

    const handleTeamUpdate = (id, column, value) => 
        const obj = 
            [column]: value
        ;
        axios
            .post('http://localhost:4000/todos/update/' + id, obj)
            .then(() => 
                console.log(`Team updated`)
                fetchTeams() // refresh the teams
            )
            .catch(error => console.error(`There was an error updating.`))
    
todoRoutes.route('/update/:id').post(function (req, res) 
    Todo.findById(req.params.id, function (err, todo) 
        if (!todo)
            res.status(404).send("data is not found");
        else
             todo.Team_Name = req.body.Team_Name;
             todo.Team_Manager = req.body.Team_Manager;
             todo.Department = req.body.Department;
             todo.Location = req.body.Location;
           // 26 more columns below the above

                todo.save().then(todo => 
                    res.json('Todo updated!');
                )
                    .catch(err => 
                        res.status(400).send("Update not possible");
                    );
    );
);

我当前的代码似乎要做的是更新我指定的项目(我在我的代码中将此称为列)但随后似乎删除/取消所有其他“列” - 我正在寻找一种更新该列的解决方案我指定但也保持所有其他列相同 - 如果我不必在我的 Update 函数中将每一列声明为参数,我会更喜欢,因为它会使代码更加混乱。

【问题讨论】:

【参考方案1】:

代替 POST

    当您想要修改已经是资源集合一部分的单一资源时,请使用 PUT

    如果请求更新部分资源,请使用 PATCH

【讨论】:

Put 和 Patch 都试过了,都没有得到想要的结果,Put 给了我相同的结果,补丁根本不更新【参考方案2】:

如果不在 Todo 模型架构上使用 Mongoose middleware 或 validations。最好使用update()updateMany()findByIdAndUpdate(),这基本上将整个查询委托给mongo 服务器。

findByIdAndUpdate() 示例:

const updateObject = 
  Team_Name: req.body.Team_Name,
  Team_Manager: req.body.Team_Manager,
  Department: req.body.Department,
  Location: req.body.Location,
;

//if the properties in req.body are same as the fields to be update use spread syntax below
// const updateObject = ...req.body;
Todo.findByIdAndUpdate(req.params.id, updateObject,  new: true , function (
  err,
  todo
) 
  if (err) 
    console.error("error occured!", err);
    return;
  

  console.info("Updated object is::", todo);
);

【讨论】:

以上是关于更新 mongoDB 中的单个项目,同时保持其余项目相同的主要内容,如果未能解决你的问题,请参考以下文章

向 ListBox 添加许多项目,同时保持 UI 响应

mongodb更新数组中的单个对象

如何将多个项目项同时插入MongoDB集合?

如何从 Spring Boot 更新 mongoDb 中的单个 JSON 字段

Mongodb,使用选定的文档值使用单个操作更新同一文档中的字段

带有 mgo 的 Go (golang) 中的 MongoDB:如何更新记录、确定更新是不是成功并在单个原子操作中获取数据?