我正在尝试更新如下所示的用户文档:
{
_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}]
});
关于 Mongoose :更新json数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62686488/