繁体   English   中英

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

[英]How to update object inside array inside object?

我有以下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
      });
    }
  );

使用MongoDb位置运算符无法获得任何结果,但找到了一种在Naing Lin Aung的答案帮助下以编程方式实现此结果的方法 解决方法如下:

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
        });
      });
    }
  );

您可以将$ []语法与arrayFilters结合使用

请参阅此链接: https : //docs.mongodb.com/manual/reference/operator/update/positional-all

 db.col.update(
{  _id: req.params.user_id }, 
{ $set: { "semesters.$[cond1].grades.$[cond2].subject": req.body.grades.subject } }, 
{ arrayFilters: [ { "cond1._id": req.params.semester_id }, { "cond2._id": req.params.grade_id  } ]  })

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM