Perché non puoi modificare i dati restituiti da una query Mongoose (es: findById)

Quando provo a modificare qualsiasi parte dei dati restituiti da una Query Mongoose, non ha alcun effetto.

Stavo cercando di capirlo per circa 2 ore ieri, con tutti i tipi di _.clone() s, usando variabili di archiviazione temporanee, ecc. Infine, proprio mentre pensavo che stavo impazzendo, ho trovato una soluzione. Così ho pensato che qualcuno in futuro (fyuuuture!) Potrebbe avere il problema di salvataggio.

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

Per casi come questo in cui si desidera un semplice object JS anziché un’istanza di modello completo, è ansible chiamare lean() sulla catena di query in questo modo:

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

In questo modo i data sono già un semplice object JS che puoi manipolare come necessario.

Penso che la documentazione di Mongoose non lo chiarisca abbastanza, ma i dati restituiti nella query (anche se è ansible res.send () it) è in realtà un object Documento Mongoose e NON un object JSON. Ma puoi aggiustarlo con una sola riga …

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