Изменение литерального результата объекта мангуста не работает

Возможный дубликат:
Почему вы не можете изменить данные, возвращаемые запросом Mongoose (например, findById)

Сначала я делаю запрос к mongoDB, получаю все правильные результаты, но не работает только небольшая модификация литерала объекта. Что я пытаюсь сделать, так это добавить новое поле в комментарии. Я попытался использовать метод DBref, но он не сработал, поэтому сейчас я делаю 2 запроса.

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

        });
      }

    }
  }
});

Также ответ без отсутствующего поля .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 }

// ИЗМЕНИТЬ дополнительную информацию

Ну, я не нашел ответа, но кое-как console.log(feed.comments[index]) возвращает ссылку на функцию. Может быть, кто-то, у кого больше опыта работы с мангустами, мог бы объяснить, что было бы обходным путем в этой ситуации.

{ [Function] author: 'Some random field' }

person Risto Novik    schedule 10.02.2012    source источник
comment
Я не знаю, возвращает ли он функцию, но ваш «индекс» не делает то, что вы хотите. Вы не должны перебирать массивы, используя for..in. Используйте правильный цикл for с диапазоном. Кроме того, findById является асинхронным, и вы никогда не фиксируете индекс в новой области, поэтому вы всегда будете использовать самый последний индекс при установке имени.   -  person loganfsmyth    schedule 10.02.2012
comment
да, это правда, как лучше всего решить последнюю проблему?   -  person Risto Novik    schedule 11.02.2012
comment
Вам нужно будет захватить индекс массива в новой области. Обычно вы оборачиваете содержимое вида for с помощью (function(index) { ... })(index);. Это создает и немедленно выполняет новую функцию, поэтому значение индекса внутри функции фиксируется в замыкании с обратным вызовом findOne.   -  person loganfsmyth    schedule 11.02.2012


Ответы (1)


Вы должны сказать Mongoose преобразовать результат в правильный объект. Перед изменением объекта фида просто вызовите:

feed = feed.toObject();

И тогда вы можете добавить к нему все дополнительные свойства, которые вы хотите.

person Brian Antonelli    schedule 30.01.2013
comment
Спасибо! Мне потребовались часы, чтобы найти это! Теперь, когда я знаю, что искал, вот ссылка на документацию API: mongoosejs. com/docs/api.html#document_Document-to-Object - person Pascal; 21.08.2013