为什么不能修改Mongoose Query返回的数据(例如:findById)

时间:2013-01-24 15:03:27

标签: node.js mongoose

当我尝试更改Mongoose Query返回的数据的任何部分时,它没有任何效果。

昨天我试图用各种_.clone()来解决这个问题,使用临时存储变量等等。最后,就在我疯了的时候,我找到了一个解决方案。所以我认为将来有人(fyuuuture!)可能会有保存问题。

Survey.findById(req.params.id, function(err, data){
    var len = data.survey_questions.length;
    var counter = 0;

    _.each(data.survey_questions, function(sq){
        Question.findById(sq.question, function(err, q){
            sq.question = q; //has no effect

            if(++counter == len) {
                res.send(data);
            }
        });
    });
});

2 个答案:

答案 0 :(得分:147)

对于这样的情况,你需要一个普通的JS对象而不是一个完整的模型实例,你可以像这样在查询链上调用lean()

Survey.findById(req.params.id).lean().exec(function(err, data){
    var len = data.survey_questions.length;
    var counter = 0;

    _.each(data.survey_questions, function(sq){
        Question.findById(sq.question, function(err, q){
            sq.question = q;

            if(++counter == len) {
                res.send(data);
            }
        });
    });
});

这种方式data已经是一个普通的JS对象,您可以根据需要进行操作。

答案 1 :(得分:45)

我认为Mongoose文档不够清楚,但查询中返回的数据(尽管你可以res.send())实际上是一个Mongoose Document对象,而不是JSON对象。但你可以用一行解决这个问题......

Survey.findById(req.params.id, function(err, data){
    var len = data.survey_questions.length;
    var counter = 0;

    var data = data.toJSON(); //turns it into JSON YAY!

    _.each(data.survey_questions, function(sq){
        Question.findById(sq.question, function(err, q){
            sq.question = q;

            if(++counter == len) {
                res.send(data);
            }
        });
    });
});