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。我想这是没有办法的,我不能仅仅用索引来更新它。我会更改它并发布更新。它成功了!非常感谢你。我在这上面花了很多时间。嘿,如果你不介意的话,请再做一件事。每当我在同一个文档上多次调用此函数时,就会丢弃一些更新。你知道我怎样才能避免这种情况吗?