无法更新猫鼬嵌套数组

时间:2021-06-18 13:57:23

标签: javascript node.js mongoose

我花了一天时间浏览 Mongoose 文档和这里的帖子,虽然我几乎可以肯定我拥有所有已解决帖子中规定的代码,但我根本无法让我的代码工作。 :(

架构相对复杂,但绝不像我所看到的那么复杂:

const hrUserSchema = new mongoose.Schema({
  username: String,
  displayName: String,
  school: String,
  leaveAuthoriser: String,
  holidayLeft: Number,
  holidayAllowed: Number,
  discretionaryDays: Number,
  emailAddress: String,
  termTimeOnly: Boolean,
  noOfAdditionalContractedDays: Number,
  noOfAdditionalContractedDaysLeft: Number,
  teachingStaff: Boolean,
  employStartDate: String,
  notes: String,
  loginAttempts: Number,
  lineManages: [{
    staffName: String
  }],
  bookedHoliday: [{
    dateEntered: String,
    startDate: String,
    endDate: String,
    daysTaken: Number,
    status: String,
    approvedBy: String,
    leaveType: String,
    declineReason: String
  }],
  additionalContractedDays: [{
    acdDateEntered: String,
    acdStartDate: String,
    acdEndDate: String,
    acdDaysTaken: Number,
    acdStatus: String,
    acdApprovedBy: String,
    acdDeclineReason: String
  }],
  perfMan: [{
    year: Number,
    selfReview: {
      sref1: String,
      sref2: String,
      sref3: String,
      sref4: String,
      sref5: String,
      status: String,
      dateStarted: String,
      dateCompleted: String,
      signedOff: Boolean
    },
    stage1: {
      objectives : [
        {
          objective: String,
          objectiveLinkToSchoolTeam: String,
          objectiveProgress: Boolean
        }
      ],
      personalDevelopment: String,
      resourcesTraining: String,
      appraiserSignOff: Boolean,
      appraiseeSignOff: Boolean
    },
    stage2: {
      feedback: String,
      appraiserSignOff: Boolean,
      appraiseeSignOff: Boolean
    },
    stage3: {
      feedback: String,
      appraiserSignOff: Boolean,
      appraiseeSignOff: Boolean
    }

  }]
});

基本上我想更新 perfMan.stage1.objectives.objectiveProgress,其中的数据示例如下:

"perfMan" : [
        {
            "_id" : ObjectId("60cb502631dcea3eaaae6853"), 
            "selfReview" : {
                "sref1" : "I have no strength", 
                "sref2" : "No developments", 
                "sref3" : "None I'm brill", 
                "sref4" : "The department has no aims", 
                "signedOff" : true
            }, 
            "stage1" : {
                "objectives" : [
                    {
                        "_id" : ObjectId("60cb502631dcea3eaaae6854"), 
                        "objective" : "Objective is pants", 
                        "objectiveLinkToSchoolTeam" : "I hate objectives!", 
                        "objectiveProgress" : false
                    }, 
                    {
                        "_id" : ObjectId("60cb502631dcea3eaaae6855"), 
                        "objective" : "My second Objectoves", 
                        "objectiveLinkToSchoolTeam" : "My Second reasons", 
                        "objectiveProgress" : false
                    }
                ], 
                "personalDevelopment" : "My personal Development", 
                "resourcesTraining" : "My Resources"
            }, 
            "stage2" : {
                "feedback" : "Keep working HARD", 
                "appraiserSignOff" : true
            }, 
            "stage3" : {
                "feedback" : "Yoy've done really well", 
                "appraiserSignOff" : true
            }, 
            "year" : NumberInt(2021)
        }
    ]

我已经阅读并尝试通过使用 arrayFilters 来实现这一点,这对我来说似乎正是我想要的,我检查了我的 Mongoose 版本(托管),它是 4.4.6,所以我很容易在 3.6 以上运行我认为这是需要的。

我当前的代码看起来像这样,我已经确认找到的数据是正确的:

 HRUser.findOneAndUpdate(
    {"username": username},
    {"$set": {"perfMan.$[perfMan].stage1.objectives.$[objectives].objectiveProgress" : true}},
    {"arrayFilters" : [{ "perfMan._id": ObjectId("" + perfmanID + "") },{ "objectives._id": ObjectId("" + objectiveID + "") }]}
  ),
  function (err, response) {
    console.log(err)
    console.log(response);
    if (!err) {
      res.send("Successfully updated staff member details.");
    } else {
      res.send(err);
    }
  };

如果有人能发现我明显的错误,我将永远感激!

谢谢

1 个答案:

答案 0 :(得分:0)

在整个周末不看屏幕并第 10 亿次通读文档后,我决定改变策略!我看不到 arrayFilters 的数量有任何限制,或者在它们中使用 objectID,我 99% 确定两个对象 ID 都是正确的,但是,在将代码更改为以下代码后,基本上使用了 a位置运算符 $ 基于对相同的第一个 objectID 和一个 arrayFilter 元素的搜索,它现在正在工作!代码如下:

  HRUser.findOneAndUpdate({
    perfMan: {
      $elemMatch: {
        _id: ObjectId("" + perfManID + "")
      }
    }
  },
  {"$set": {"perfMan.$.stage1.objectives.$[objectives].objectiveProgress" : false}},
  {"arrayFilters" : [{ "objectives._id": ObjectId("" + objectiveID + "") }]},
  function (err, response) {
        console.log(err)
        console.log(response);
  });