2017-04-05 65 views
3

我有一個數組內的2個不同的對象,我想使用這些對象在我的MongoDB 更新集合所以,我雖然關於使用這樣的事情:節點JS Mongoose更新查詢裏面for或foreach循環,這有可能嗎?

for (i = 0 ; i < array.length ; i++) { 
Model.update({array[i]._id},{$set : {'credits_pending' : array[i].credits_pending}},false,true) 
} 

但它僅更新的第一個值我的數組,我的意思是,數組[0]

爲什麼?

+0

這種方法是不正確的。如果你想更新多個文件,你不應該選擇一些對所有文件都通用的屬性。如果這是不可能的,你應該使用承諾。 –

+0

我的目標是用不同的值更新不同的文檔,我該怎麼做?我沒有找到解決方案:/ –

回答

5

首先,Mongoose中的更新(以及大多數其他操作)是異步的,因此您需要等到操作完成才能繼續。在同一個集合上一次執行一個操作通常會更好。使用for循環,您在同一個集合上同時運行兩個異步操作,這可能會導致不希望的行爲。

其次,我認爲你的Model.update()參數略有偏差。

我喜歡在使用Mongoose時使用async.js,所以下面是一個關於如何一次更新一個對象數組的示例。

var async = require('async'); 

async.eachSeries(array, function updateObject (obj, done) { 
    // Model.update(condition, doc, callback) 
    Model.update({ _id: obj._id }, { $set : { credits_pending: obj.credits_pending }}, done); 
}, function allDone (err) { 
    // this will be called when all the updates are done or an error occurred during the iteration 
}); 
+0

謝謝先生,你是一個天才! –

+1

我無法用這個答案解決。它只是更新數組的第一個元素 – Loint

0

我不知道你的架構的模樣,但如果這是要做到這一點,你可以試試的唯一途徑 -

//array - your original array 
     async.eachSeries(array, function(rec, callback) { 
      updateRecord(rec._id, rec.credits_pending) 
        .then((updated) => { 
         callback(); 
        }) 
     }, function(err){ 
      //execution comes here when array is fully iterated. 
     }); 

    function updateRecord(id, credits) { 
    return Model.update({array[i]._id},{$set : {'credits_pending' : array[i].credits_pending}}); 
    } 

貓鼬內部支持的承諾,所以你不必擔心別的。
「注意」 - 爲了更新多個文檔,您應該選擇一些對所有文檔都通用的屬性。這種方法是不正確的,你應該設計你的模式來避免這種情況。這個答案是在你沒有其他選擇的情況下。

+0

我認爲它應該是'Model.update({_id:id},{$ set:{'credits_pending':credits}});'在你的例子中。 – Mikey

+0

@Mikey我一認識就編輯它。 Thnks。 :) –