我正在创建一个投票应用程序,我的应用程序模型如下所示。每当用户投票时,就会通过req.body.select
接收值。首先,我运行一个循环以在pollsOption
中找到该选项的索引(请告知我这种方法是否有更好的替代方法)。我使用该索引来访问vote
中的pollsOption
属性。然后,将vote
存储在一个变量中,并对其进行更新。我想通过新的投票来更新vote
的值,但是由于嵌套的猫鼬模型,这不起作用。
Polls.findOne({_id:req.params.id})
.then(poll=>{
const pollsOption = poll.pollsOption;
let index = null;
let vote=null;
for (let i=0;i<pollsOption.length;i++){
if(pollsOption[i].option == req.body.select){
index=i;
vote=pollsOption[i].vote;
}
}
vote++;
const dynKey = `'pollsOption.${index}.vote'`;
poll.update({
$set:{
[dynKey]:vote
}
}).then(poll=>{
console.log("Form is updated",poll);
});
res.send("Form is submitted");
})
.catch(e=>{
console.log("Error",e);
})
答案 0 :(得分:0)
根据我的知识,没有办法直接在数组中查找和更新值,只有我知道如何从集合中提取旧值并添加新值。希望这会有所帮助
Polls.findOneAndUpdate({_id:req.params.aid}, { $pull: {'pollsOption' : { 'option' :req.body.select}}} ,function (err, _Polls) {
if(err)
{
console.log(err);
//handle error
}
else
{
Polls.findOneAndUpdate({_id:req.params.aid}, { $addToSet: {'pollsOption' : {"option" : poll.pollsOption, "vote" : "new vote"}}} , {upsert: true, new:true},function (err, _Polls) {
if(err)
{
console.log(err);
//handle error
}
else
{
//Do Code
}
});
}
});