在MongoDB中更改数组元素的值

时间:2019-06-15 03:05:02

标签: javascript node.js mongodb

我正在尝试更改数组中特定元素的值。该数组包含两个字段的对象。这是我的视图输出:

Screenshot

每行对应于该对象在数组中的索引。目标数组中有一个 name 字段(字符串)和一个 progress 字段(int)。输入框显示存储在数据库中的当前值,我希望它更新为我输入的任何值。例如,如果我将“ 25”更改为“ 30”,则应在按下右侧按钮后将其更新为“ 30”。

如果我能够访问该名称,则可以更轻松地在数组中找到正确的对象。但是,我不确定如何从视图和相应的输入框中进行操作。

这是数据库中的一个条目,用于进一步演示:

DB Document

这是我到目前为止拥有的控制器功能。它找到正确的文档,但实际上未能更新。此外,该函数应能够基于以下条件更新数组中的正确索引:

const managerChangeGoalProgress = async (req, res) => {
  await Employee.updateOne( {_id: req.params.id}, {$set: {"goals.progress" : req.body}} );
  req.flash('success', 'Succesfully Updated Goal!');
  res.redirect(`managers/employees/${req.params.id}/goals`);
};

任何帮助或建议将不胜感激。预先谢谢你!

3 个答案:

答案 0 :(得分:0)

您可以使用下划线js或lodash进行此操作。

答案 1 :(得分:0)

因此,我找到了替代解决方案。首先,我将其从几种形式更改为一种形式,即一个按钮,这是我意识到的更好的方法。 req.body以数组的形式从输入框中返回所有值。我花了一些时间为更新函数找到正确的语法,因为它不接受我在for循环中拥有的js变量。事实证明,有必要在$ set之后的第一个参数中将变量包装在方括号中。这是代码:

const managerChangeGoalProgress = async (req, res) => {
  for (var i = 0; i < req.body.progress.length; i++) {
    var setValue = "goals." + i.toString() + ".progress";
    var change = req.body.progress[i];
    await Employee.update( {_id: req.params.id},  {$set: { [setValue] : change }});
  };

答案 2 :(得分:0)

您可以尝试:

const managerChangeGoalProgress = async (req, res) => {
    let employee = await Employee.findOne({_id: req.params.id}).exec();
    employee.goals[index].progress=req.body.progress //change to your variable, index is your postion you want to change
    await employee.save();
    req.flash('success', 'Succesfully Updated Goal!');
    res.redirect(`managers/employees/${req.params.id}/goals`);
  };