在for循环中更新MongoDB数据库中的每个元素

时间:2014-06-12 17:35:35

标签: node.js mongodb

我有一个userIDs数组(MongoDB Objectid),我想迭代它,并为每一个,在我的MongoDB用户数据库中找到它的用户条目,并更新它,比如修改用户的年龄。然后,只有在每个用户都更新后,我才能在res.send(200); Express应用中说出Node.js

我开始使用以下代码,由于对findById的异步调用,这是完全错误的:

for (var i = 0; i < userIDs.length; i++) {
    var userID = userIDs[i];

    User.findById(userID, function (err, user) {
        if (err) throw err;

        // Update user object here

        user.save(function (err, user) {
            if (err) throw err;
            res.send(200);
        });
    });
}

我有什么想法可以做到这一点?可能是findById的同步版本吗?或者也许是通过数组map的方法并将函数应用于每个元素?

谢谢!

2 个答案:

答案 0 :(得分:2)

我想你想要npm的forEach模块的async方法。它看起来像这样:

async.forEach(userIDs, function(id, callback) {
    User.findById(id, function(err, user){
        if(err) throw err;
        user.save(function(err, user){
            if(err) throw err;
            callback();
        }
    }, function(err){
        if(err){
            throw err;
        } else {
            res.send(200);
        }
    }
}

答案 1 :(得分:2)

最好的方法是使用承诺。

Q#all的一个例子:

var q = require('Q');

var promises = userIDs.map(function(userID){

  var deferred = q.defer();

  User.findById(userID, function (err, user) {
     if (err) return deferred.reject(err);

    // Update user object here

    user.save(function (err, user) {
      if (err) return deferred.reject(err);      
      deferred.resolve(user);
    });
  });

  return deferred.promise;

});


q.all(promises)
  .then(function(users){
    res.json(users);
  })
  .fail(function(err){
    res.send(500,err);
  });