102

Mongoose Query によって返されたデータの一部を変更しようとしても、効果がありません。

私は昨日約 2 時間、あらゆる種類の_.clone()s を使用して、一時的なストレージ変数などを使用して、これを理解しようとしていました。ついに、私が夢中になっていると思ったときに、解決策を見つけました。だから私は、将来誰かが保存の問題を抱えているかもしれないと考えました.

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 オブジェクトではありません。しかし、これを1行で修正できます...

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 に答える