我正在尝试更新如下所示的用户文档:
{
_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已更新,但问题对象未更新。
答案 0 :(得分:1)
您可以使用猫鼬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'}
}, {
arrayFilters: [{'elem1.trialId': trialId}, {'elem2': questionId}]
});