节点JS Mongoose更新查询里面或foreach循环,是否可能?

时间:2017-04-05 10:55:03

标签: javascript ajax mongodb mongoose

我在数组中有2个不同的对象,我想使用这些对象来更新我的mongodb中的集合 所以我虽然使用这样的东西:

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

但它只更新我的数组的第一个值,我的意思是数组[0]

为什么?

2 个答案:

答案 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内部支持承诺,所以你不必担心其他任何事情 “注意” - 要更新多个文档,您应该选择一些所有文档共有的属性。这种方法不正确,您应该设计模式以避免此类情况。如果你没有任何其他选择,这个答案就是答案。