2012-02-10 10 views
5

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' } 
+0

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

+0

tak to prawda, jaki byłby najlepszy sposób rozwiązania ostatniego problemu? –

+1

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

Odpowiedz

10

Musisz powiedzieć Mongoose, aby przekształcić wynik w odpowiedni obiekt. Przed zmianą przedmiotu paszy wystarczy zadzwonić:

feed = feed.toObject(); 

a następnie można dodać wszelkie dodatkowe właściwości, które mają do niego.

+0

Dziękujemy! Znalezienie tego zajęło mi godziny! Teraz, gdy wiem, czego szukałem, oto link do dokumentacji interfejsu API: http://mongoosejs.com/docs/api.html#document_Document-toObject – Pascal