mongoose:json数组中的update元素

mongoose:json数组中的update元素,mongoose,atlas,Mongoose,Atlas,我正在尝试更新如下所示的用户文档: { _id:"xyzdon'tcare", username:"john", examTrials:Array[ { trialId:"x1", examId:"y", questions:Array[ {ques1 Object}, {ques2 object}

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

{
_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()来更新questions数组中的一个question对象,但我似乎不知道如何做到这一点

我所掌握的资料如下:

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

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

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

User.findOneAndUpdate({
_id:userId
}, {
$set:{'examTrials.$[elem1].questions.$[elem2]':newQuestionObject}
}, {
数组过滤器:[{'elem1.trialId':trialId},{'elem2':questionId}]
});
或者,如果您想更新问题对象的特定字段,您可以这样做:

{
_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}
        ]
    }]
}
User.findOneAndUpdate({
_id:userId
}, {
$set:{'examTrials.$[elem1]。问题。$[elem2]。状态“:'newStatus'}
}, {
数组过滤器:[{'elem1.trialId':trialId},{'elem2':questionId}]
});

目前,我设法更新了整个数组,方法是复制它,然后使用var filter={'username':user.username}var update={$set:{'examTrials':user.examTrials}User.findOneAndUpdate(filter,update,{new:true})。然后(User=>{console.log('updated')}),但这是低效的,我需要一种方法来更新数组中的特定记录。。还是做不到这很有帮助谢谢!但是,当我使用此方法更新examId时,它是有效的。但是obj这个问题(我实际上需要改变)没有。我是否应该像使用save函数一样标记已修改的数组?请尝试
arrayFilters
中的'elem2.\u id'或您在模式中为问题id设置的任何字段。我认为我不需要问题的模式。我只是将模式中数组的类型设置为MIxed。我想这是没有办法的,我不能仅仅用索引来更新它。我会更改它并发布更新。它成功了!非常感谢你。我在这上面花了很多时间。嘿,如果你不介意的话,请再做一件事。每当我在同一个文档上多次调用此函数时,就会丢弃一些更新。你知道我怎样才能避免这种情况吗?