Powiel możliwe:
Why can’t you modify the data returned by a Mongoose Query (ex: findById)Modyfikowanie mangusta sprzeciw wynik dosłowny nie działa
First Robię zapytanie do MongoDB, uzyskać wszystkie poprawne wyniki, ale tylko niewielka modyfikacja obiektu dosłowny nie działa. Próbuję dodać nowe pole do komentarzy. Próbowałem użyć metody DBref, ale to nie zadziałało, więc teraz robię 2 zapytania.
var query = Rss.findOne({ _id: itemId});
query.exec(function(err, feed) {
if (!err && feed.comments) {
console.log(feed.comments.length);
for (var index in feed.comments) {
var author = feed.comments[index].author;
if (author !== undefined) {
User.findById(author, function(err, user) {
/**Problem is here **/
feed.comments[index].name = 'Some random field';
console.log('Added new field' + util.inspect(feed));
});
}
}
}
});
Również odpowiedź jest bez brakującego pola .name.
Added new field{ _id: 4f34f343c7b0434217000012,
original_link: 'http://com',
publish_date: Fri, 10 Feb 2012 10:36:00 GMT,
summary: 'some text',
title: 'title exampel',
comments:
[ { body: 'well',
author: 4f30265e6f60dc061d000002,
_id: 4f34f3b6f96c58541700000f,
create_date: Fri, 10 Feb 2012 10:38:46 GMT } ],
create_date: Fri, 10 Feb 2012 10:36:51 GMT }
// EDIT więcej informacji
No i nie znalazłem odpowiedzi, ale niektóre jak console.log (feed.comments [index]) zwraca referencję do funkcji. Może ktoś, kto ma większe doświadczenie z mangowcami, mógłby wyjaśnić, co byłoby rozwiązaniem w tej sytuacji.
{ [Function] author: 'Some random field' }
Nie wiem o tym, zwracając funkcję, ale twój "indeks" nie robi tego, co chcesz. Nie powinieneś przechodzić przez tablice za pomocą 'for..in'. Użyj odpowiedniej pętli 'for' z zakresem. Również 'findById' jest asynchroniczne i nigdy nie przechwytujesz indeksu to nowy zakres, więc zawsze będziesz używać ostatniego indeksu podczas ustawiania nazwy. – loganfsmyth
tak to prawda, jaki byłby najlepszy sposób rozwiązania ostatniego problemu? –
Musisz przechwycić indeks tablicy w nowym zakresie. Zwykle można zawijać zawartość wyglądu za pomocą '(function (index) {...}) (index);'. To tworzy i natychmiastowo wykonuje nową funkcję, więc wartość indeksu wewnątrz funkcji jest przechwytywana w zamknięciu z wywołaniem findOne. – loganfsmyth