猫鼬:json数组中的update元素

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

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

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

现在,我正尝试使用findOneAndUpdate()在特定的试验中更新问题数组中的问题对象,而我似乎还不知道该怎么做。

我所拥有的信息:

  • 试用ID
  • 问题obj
  • 问题ID

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

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

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已更新,但问题对象未更新。

iCMS 回答:猫鼬:json数组中的update元素

您可以使用猫鼬arrayFilter更新数组中的字段。

例如,如果您有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'}
},{'elem2': questionId}]
});
本文链接:https://www.f2er.com/2017323.html

大家都在问