1. ホーム
  2. node.js

[解決済み] Mongoose クエリ (例: findById) が返すデータを変更できないのはなぜですか?

2022-12-14 16:03:32

質問

Mongoose クエリで返されたデータのどこかを変更しようとしても、効果がありません。

私は昨日2時間ほどこれを理解しようとして、あらゆる種類の _.clone() を使ったり、一時記憶変数を使ったりして、2 時間ほどこの問題を解決しようとしていました。ようやく、気が狂いそうになったときに、解決策を見つけました。だから、未来の誰かが(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);
            }
        });
    });
});

どのように解決するのですか?

このように、完全なモデルインスタンスではなく、プレーンな 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オブジェクトであり、必要なように操作することができます。