我在数组中有2个不同的对象,我想使用这些对象来更新我的mongodb中的集合 所以我虽然使用这样的东西:
for (i = 0 ; i < array.length ; i++) {
Model.update({array[i]._id},{$set : {'credits_pending' : array[i].credits_pending}},false,true)
}
但它只更新我的数组的第一个值,我的意思是数组[0]
为什么?
答案 0 :(得分:9)
首先,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
});
答案 1 :(得分: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}});
}
Mongoose内部支持承诺,所以你不必担心其他任何事情 “注意” - 要更新多个文档,您应该选择一些所有文档共有的属性。这种方法不正确,您应该设计模式以避免此类情况。如果你没有任何其他选择,这个答案就是答案。