簡體   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