109 votes

Pourquoi ne pouvez-vous pas modifier les données renvoyées par une requête Mongoose (ex : findById) ?

Lorsque j'essaie de modifier une partie des données renvoyées par une requête Mongoose, cela n'a aucun effet.

J'ai essayé de comprendre ça pendant 2 heures hier, avec toutes sortes de _.clone() l'utilisation de variables de stockage temporaire, etc. Finalement, alors que je pensais devenir fou, j'ai trouvé une solution. J'ai donc pensé que quelqu'un dans le futur (fyuuuture !) pourrait avoir le même problème de sauvegarde.

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

180voto

JohnnyHK Points 61191

Pour les cas comme celui-ci où vous voulez un objet JS simple au lieu d'une instance de modèle complète, vous pouvez appeler lean() sur la chaîne de requête comme suit :

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

De cette façon data est déjà un objet JS ordinaire que vous pouvez manipuler comme bon vous semble.

50voto

Toli Zaslavskiy Points 2001

Je pense que la documentation Mongoose n'est pas assez claire, mais les données renvoyées dans la requête (bien que vous puissiez les envoyer par res.send()) sont en fait un objet Mongoose Document, et NON un objet JSON. Mais vous pouvez corriger cela en une ligne...

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

1voto

vivek sharma Points 101

J'utilisais Mongoose et voici les solutions de contournement que j'ai utilisées pour résoudre le problème :

1) : Mongoose renvoie des objets MongooseDocument et non des objets JSON simples. Utilisez donc la méthode lean() sur l'objet qui le convertira en JSON, et à partir de là, vous pourrez le modifier.

const leanDoc = await MyModel.findOne().lean();

---------------------------------OR---------------------------------

2) : Créer une copie profonde du résultat retourné par la requête find comme indiqué ci-dessous

Books.find({}).then(books => { 
    books = JSON.parse(JSON.stringify(books));
    //now you can update the books object
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X