javascript - Mongodb 返回填充对象但保存清空一些字段

标签 javascript node.js mongodb mongoose

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

这是代码:

Controller

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

再次一切正常,但它只是在创建 newSemestre 时保存一个空的 materias 数组。

最佳答案

尝试以下方式:-

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 的最后一个循环进行,函数将被调用。这是我现在能想到的。

希望这会有所帮助。

关于javascript - Mongodb 返回填充对象但保存清空一些字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37605619/

相关文章:

javascript - 使用 javascript 从图像中删除灰度 css 过滤器

regex - 使用 fs 在 multer 中重命名上传的图像

node.js - 具有版本化数据和差异端点的 REST API : optimizing bandwidth and performance

MongoLab 上的 Node.js 和 MongoDB : "Sockets Closed" On Every Insert

javascript - 将 img 和样式更改为折叠主体上方的元素

javascript - 在元素的第二个动画上调用 promise 函数而不是第一个?

node.js - Sails.js Waterlock/auth/register 导致错误 500

javascript - 如何使用 Passport.js 循环遍历用户并将用户列表打印到 DOM 中

javascript - Mongoose :聚合和计数

javascript - Html 类事件监听器无法正常工作