2015-03-07 2 views
0

У меня есть объект MongoDB, как это:Как добавить дополнительный элемент во все вложенные массивы объекта MongoDB?

[ 
    { poster_ip: '127.0.0.1', 
    post_body: 'example', 
    _id: 54fc1f7808bac08f6d25f24b, 
    __v: 0 }, 

    { poster_ip: '127.0.0.1', 
    post_body: 'example', 
    _id: 54fc1f7808bac08f6d25f24a, 
    __v: 0 } 
] 

как я могу добавить дополнительный элемент для каждого вложенного массива, поэтому было бы так:

[ 
    { poster_ip: '127.0.0.1', 
    post_body: 'example', 
    _id: 54fc1f7808bac08f6d25f24a, 
    __v: 0, 
    newName: NewValue }, 

    { poster_ip: '127.0.0.1', 
    post_body: 'example', 
    _id: 54fc1f7808bac08f6d25f24b, 
    __v: 0, 
    newName: NewValue }, 
] 

Я попытался это, но он не сделал работа:

for(var i=0; i<JSONobject.length; i++){ 
    JSONobject[i].newName= NewValue; 
} 

Я использую node.js, объект - результат, который я получаю из запроса mongodb.

Вот функция:

exports.Posts = function(UserID, PostID, callback) { 

       Post.find({ post: PostID } , function(err, results) { 

       var r = results.toObject(); //here i get error 'has no method toObject' 

       for (var i=0; i<r.length; i++){ 
        r[i].newName = "NewValue"; 
       } 

       console.log(r); 
        //i don't see any changes here with console.log 

        return callback(null, results); 
       }); 
} 

EDIT:

После немного больше исследований я обнаружил, что возвращаемый Mongoose документ не является объектом JSON, поэтому я пытаюсь в настоящее время чтобы преобразовать его в объект.

+2

Итерация на основе 'JSONobject.length' и изменение' результатов [я] '? – thefourtheye

+0

Существуют серьезные семантические проблемы, из-за которых трудно следовать за вами. Является ли 'JSONobject' массивом Javascript? Это буквальный, который вы впервые пишете в своем вопросе? Тогда что значит «результаты»? –

+0

Цикл 'for', который вы разместили, выглядит отлично. Что заставляет вас думать, что это не сработало? – Pointy

ответ

0

Я нашел ответ !!

Мы должны сообщить Mongoose, что все, что нам нужно, это простая версия JavaScript с возвратом results с использованием lean() в цепочке запросов.

Таким образом Mongoose пропускает шаг создания полного экземпляра модели, и мы непосредственно получаем results мы можем изменить

Как это:

exports.Posts = function(UserID, PostID, callback) { 

       Post.find({ post: PostID } , function(err, results) { 


         for (var i=0; i<results.length; i++){ 
          results[i].newName = "NewValue"; 
         } 

         console.log(results); 

         return callback(null, results); 

       }).lean(); 
} 
0

Я не уверен, почему цикл for потерпит неудачу, потому что это кажется мне прекрасным. Но попробуйте это:

results = results.map(function(item) { 
    item.newName = "NewValue"; 
    return item; 
}); 

Это создаст новый массив, в котором каждый исходный элемент будет добавлен с новым значением.

(как правило, с использованием .forEach(), .map(), .filter(), .reduce(), .every() и .some() почти всегда превосходит for когда цикл по массиву)

+0

Извините, не работает. Я начинаю верить, что мой объект не является объектом JSON. –

+0

Цикл 'for' действительно прекрасен, что-то еще не так. Может быть, глупая ошибка, я не знаю, я сделаю все возможное, чтобы это выяснить. –

+0

'console.log (Object.prototype.toString.call (результаты));' возвращает 'объект Array' –

Смежные вопросы