猫鼬:更新 json 数组中的元素

mongoose: update element in json array

我正在尝试更新如下所示的用户文档:

{
_id:"xyzdon'tcare",
username:"john",
examTrials:Array[
    {
        trialId:"x1",
        examId:"y",
        questions:Array[
            {ques1 Object},
            {ques2 object}
        ]
    },
    {
        trialId:"x2",
        examId:"z",
        questions:Array[
            {ques1 Object},
            {ques2 object}
        ]
    }]
}

我尝试了最直接的方法,findOne() 然后修改文档,然后 save()。问题是,当新请求在上一次更新完成之前到达时,我遇到了文档版本的竞争条件问题。

现在我正在尝试使用 findOneAndUpdate() 来更新特定试验中问题数组内的问题对象,但我似乎无法弄清楚如何做到这一点。

我掌握的信息:

我想这就是我所需要的。有帮助吗?

------------ 编辑

app.post('/updatetrialsession',authenticateJWT ,(req,res)=>{
        User.findOneAndUpdate({
        username: req.user.username
      }, {
           $set: {'examTrials.$[elem1].questions.$[elem2]' : req.body.question,
                'examTrials.$[elem1].currentQuestion':req.body.questionIdx+1 }
      }, {
           arrayFilters: [{'elem1.trialId': req.body.trialId }, {'elem2': req.body.questionIdx}]
      }).then(res=>{
          console.log("updated")
      })
})

currentQuestion 已更新,但问题对象没有。

您可以使用 mongoose arrayFilter 来更新数组中的 a 字段。

例如,如果您有 userId 查询您的用户,trialId 查询您的试卷,questionId 查询您的问题,newQuestionObject 作为您的更新对于此代码将为您完成工作的问题:

User.findOneAndUpdate({
  _id: userId
}, {
     $set: {'examTrials.$[elem1].questions.$[elem2]' : newQuestionObject}
}, {
     arrayFilters: [{'elem1.trialId': trialId}, {'elem2': questionId}]
});

或者,如果您想更新问题对象的特定字段,您可以简单地这样做:

User.findOneAndUpdate({
  _id: userId
}, {
     $set: {'examTrials.$[elem1].questions.$[elem2].status' : 'newStatus'}
}, {
     arrayFilters: [{'elem1.trialId': trialId}, {'elem2': questionId}]
});