猫鼬如何更新嵌套模型?

时间:2018-06-22 15:36:23

标签: node.js mongoose

我正在创建一个投票应用程序,我的应用程序模型如下所示。每当用户投票时,就会通过req.body.select接收值。首先,我运行一个循环以在pollsOption中找到该选项的索引(请告知我这种方法是否有更好的替代方法)。我使用该索引来访问vote中的pollsOption属性。然后,将vote存储在一个变量中,并对其进行更新。我想通过新的投票来更新vote的值,但是由于嵌套的猫鼬模型,这不起作用。 enter image description here

 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);
        })

1 个答案:

答案 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
        }

    });

}

});