Mongodb返回填充的对象,但保存清空某些字段

时间:2016-06-03 03:52:32

标签: javascript node.js mongodb mongoose

所以我有一点问题,当我发布数据库保存数据时,它确实一切正常并返回应该是的对象,但是当我从数据库中获取它时,它带有一个空数组,我知道我用数据保存这个数组。

这是代码:

控制器

    router.post("/semestre", function(req, res) {
    var req = req;
    var res = res;
    console.log("hello! routed to /semestre [create]");
    //build needs
    var newSemestre = new semestreModel();
    //fecthing materias


    newSemestre.nome = req.body.nome;
    if (req.body.materias.length > 0) {
        var materias = JSON.parse(req.body.materias);
        materias.forEach(function(materia, index) {
            //building needs  
            var newMateria = new materiaModel();
            //fechting avaliacoes
            newMateria.nome = materia.nome;
            newMateria.avaliacoes = [];
            if (materia.avaliacoes.length > 0) {
                materia.avaliacoes.forEach(function(avaliacao, index) {
                    //console.log("avaliacao:" + avaliacao.nome);
                    //building nedds
                    var newAvaliacao = new avaliacaoModel();
                    newAvaliacao.nome = avaliacao.nome;
                    newAvaliacao.nota = avaliacao.nota;
                    newAvaliacao.save(function(err, availacao) {
                        if (err) {
                            console.log("@semestres [create] - saving avaliacao has error");
                            res.send({ erro: true, msg: "Oops! alguma coisa está errada!" });
                        } else {
                            newMateria.avaliacoes.push(avaliacao._id);
                        }
                    });
                });
            } else {
                console.log("avaliacoes:[]");
            }

            newMateria.save(function(err, materia) {
                if (err) {
                    //console.log(err);
                    console.log("@semestres [create] - saving materia has error");
                    res.send({ erro: true, msg: "Oops! alguma coisa está errada!" });
                } else {
                    newSemestre.materias.push(materia._id);
                }
            });
        });
    }

    newSemestre.save(function(err, semestre) {
        if (err) {
            //console.err(err);
            console.log("saving semestre has error");
            res.send({ erro: true, msg: "Oops! alguma coisa está errada!" });
        } else {
            //console.log(semestre);
            res.send(semestre);
        }
    });

});

架构

var materia = {
    nome: String,
    notaFinal:Number,
    semestre_id:String,
    frequencia:Number
  };
var MateriaSchema = new Schema(materia );

var model = {
    nome: String,
    materias: [String],
    completo: Boolean
};
var SemestreSchema = new Schema(model);

var model = {
    nome: String,
    materia_id: String,
    nota: Number
};
var AvaliacaoSchema = new Schema(model);

同样一切正常,但在创建materias时只会保存newSemestre的空数组。

1 个答案:

答案 0 :(得分:2)

尝试以下方式: -

var newSemestre = new semestreModel();
//fecthing materias

newSemestre.nome = req.body.nome;
if (req.body.materias.length > 0) 
{
    var materias = JSON.parse(req.body.materias);
    materias.forEach(function(materia, parentIndex) 
   {
        //building needs  
        var newMateria = new materiaModel();
        //fechting avaliacoes
        newMateria.nome = materia.nome;
        newMateria.avaliacoes = [];
        if (materia.avaliacoes.length > 0)
        {
            materia.avaliacoes.forEach(function(avaliacao, index)
           {
                //console.log("avaliacao:" + avaliacao.nome);
                //building nedds
                var newAvaliacao = new avaliacaoModel();
                newAvaliacao.nome = avaliacao.nome;
                newAvaliacao.nota = avaliacao.nota;
                newAvaliacao.save(function(err, availacao) 
                 {
                    if (err) {
                        console.log("@semestres [create] - saving avaliacao has error");
                        res.send({ erro: true, msg: "Oops! alguma coisa está errada!" });
                    } else {
                        newMateria.avaliacoes.push(avaliacao._id);
                    }
                });
            });
        }
        else
        {
            console.log("avaliacoes:[]");
        }

        newMateria.save(function(err, materia) 
        {
            if (err) 
           {
                //console.log(err);
                console.log("@semestres [create] - saving materia has error");
                res.send({ erro: true, msg: "Oops! alguma coisa está errada!" });
            } 
            else
            {
                newSemestre.materias.push(materia._id);

                //If the last loop of "foreach" is going on, then only call the function, which will do save.
                if(parentIndex > req.body.materias.length)
                {
                      saveSemester(); // call some function
                }
            }
        });
    });
}

});

这个功能就在这里。

function saveSemester()
{
    // do stuff to save semester
}

保存空数组,因为在您尝试保存学期之前,该数组中没有数据。因此,您需要等待推送完成,然后继续执行保存,这将保存您想要的数据。

<强>更新

更新了我的回答。一旦最后一个循环进入foreach,函数将被调用。这就是我现在能想到的。

希望这会有所帮助。