【问题标题】:Node JS Mongoose update query inside for or foreach loop, is it possible?Node JS Mongoose 在 for 或 foreach 循环中更新查询,这可能吗?
【发布时间】:2017-04-05 10:55:02
【问题描述】:

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

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

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

为什么?

【问题讨论】:

  • 这种做法是不对的。如果您想更新多个文档,您不应该选择所有文档共有的一些属性。如果这不可能,你应该使用 Promise。
  • 我的目标是用不同的值更新不同的文档,我该怎么做?我在任何地方都没有找到解决方案:/

标签: javascript ajax mongodb mongoose


【解决方案1】:

一方面,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
});

【讨论】:

  • 谢谢你,先生,你真是个天才!
  • 我无法用这个答案解决。它只是更新数组的第一个元素
  • 这个很完美,你也可以拉出循环中的每个项目!
【解决方案2】:

我不知道您的架构是什么样子,但如果这是唯一的方法,请尝试类似 -

//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 内部支持 Promise,因此您不必担心其他任何事情。
“注意” - 要更新多个文档,您应该选择所有文档共有的一些属性。这种方法是不正确的,您应该设计您的架构以避免这种情况。这个答案是在你别无选择的情况下。

【讨论】:

  • 我认为在你的例子中应该是Model.update({ _id: id },{$set : {'credits_pending' : credits }});
猜你喜欢
  • 2013-07-20
  • 2015-11-08
  • 2020-12-25
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
相关资源
最近更新 更多