102

当我尝试更改猫鼬查询返回的数据的任何部分时,它没有任何效果。

昨天我试图弄清楚这个大约2个小时,各种_.clone()s,使用临时存储变量等。最后,就在我快要发疯的时候,我找到了解决方案。所以我想将来有人(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);
            }
        });
    });
});
4

2 回答 2

171

对于这样的情况,您需要一个普通的 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 对象,您可以根据需要进行操作。

于 2013-01-24T21:09:32.510 回答
47

我认为 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);
            }
        });
    });
});
于 2013-01-24T15:03:26.570 回答