如何更新对象内部数组中的对象?

时间:2018-12-26 23:24:53

标签: arrays node.js mongodb api mongoose

我有以下Mongooose模式:

    {
      _id: {
        type: String,
        required: true
      },          
      semesters: [
        {
          _id: {
            type: String,
            required: true
          },
          grades: [
            {
              subject: String,
              literalGrade: String,
              grade: Number,
              credits: Number
            }
          ]
        }
      ]
    }

我希望能够使用其ID更新一个学期成绩对象中的一个成绩。我尝试使用MongoDb新的多位置运算符无济于事。

这是我当前的代码段:

User.findOneAndUpdate(
    {
      _id: req.params.user_id,
      "semesters._id": req.params.semester_id
    },
    {
      $set: {
        "semesters.$[x].grades.$[y].subject": req.body.grades.subject,
        "semesters.$[x].grades.$[y].literalGrade": req.body.grades.literalGrade,
        "semesters.$[x].grades.$[y].grade": req.body.grades.grade,
        "semesters.$[x].grades.$[y].credits": req.body.grades.credits
      }
    },
    {
      arrayFilters: [
        { "x._id": req.params.semester_id },
        { "y._id": req.params.grade_id }
      ]
    },
    (err, user) => {
      if (err) return res.json(err);
      res.send({
        message: "Updated grade",
        data: user
      });
    }
  );

2 个答案:

答案 0 :(得分:0)

使用MongoDb位置运算符无法获得任何结果,但是找到了一种在Naing Lin Aung's answer的帮助下以编程方式进行操作的方法。解决方法如下:

User.findOne(
    {
      _id: req.params.user_id,
      "semesters.grades._id": req.params.grade_id
    },
    { "semesters.$.grades": 1 },
    (err, user) => {
      if (err) return res.json(err);

      let grades = user.semesters[0].grades;
      let index = null;

      for (let t in grades) {
        if (grades[t]._id == req.params.grade_id) {
          index = t;
          break;
        }
      }

      let grade = grades[index];

      grade.subject = req.body.grades.subject;
      grade.literalGrade = req.body.grades.literalGrade;
      grade.grade = req.body.grades.grade;
      grade.credits = req.body.grades.credits;

      user.save(function(err) {
        if (err) return res.json(err);
        res.json({
          message: "Updated grade",
          data: user
        });
      });
    }
  );

答案 1 :(得分:0)

您可以利用arrayFilters的$ []语法

引用此链接: https://docs.mongodb.com/manual/reference/operator/update/positional-all

phpseclib

您可以类似地更新$ set中的其他字段