Kiedy próbuję zmienić jakąkolwiek część danych zwróconych przez zapytanie Mongoose, nie ma to żadnego efektu.
Próbowałem to rozgryźć wczoraj przez około 2 godziny, z różnymi rodzajami _.clone()
, używając zmiennych tymczasowego przechowywania itp. W końcu, kiedy pomyślałem, że wariuję, znalazłem rozwiązanie. Więc pomyślałem, że ktoś w przyszłości (fyuuuture!) Może mieć problem z zapisywaniem.
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);
}
});
});
});
Odpowiedzi:
W takich przypadkach, w których chcesz zwykłego obiektu JS zamiast pełnej instancji modelu, możesz wywołać
lean()
łańcuch zapytań w następujący sposób: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); } }); }); });
W ten sposób
data
jest już zwykłym obiektem JS, którym możesz manipulować według potrzeb.źródło
aggregate
zawsze dostarcza wyniki jako zwykłe obiekty, więc nie ma takiej potrzebylean()
.Myślę, że dokumentacja Mongoose nie wyjaśnia tego wystarczająco jasno, ale dane zwrócone w zapytaniu (chociaż można je res.send ()) są w rzeczywistości obiektem Mongoose Document, a NIE obiektem JSON. Ale możesz to naprawić jedną linią ...
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); } }); }); });
źródło
toObject()
, który robi to samo,toJSON()
ale z mniej mylącą nazwą.TypeError: data.toObject is not a function
Mam to samo ztoJSON
result
, mogłem zmodyfikowaćresult._doc
.JSON.parse(JSON.stringify(data))
zamiast tego dla Arrays of object