如何在NodeJ中手动更新多个Mongo文档?

时间:2016-05-07 13:24:09

标签: javascript node.js mongodb asynchronous promise

我在MongoDB中有一个users的集合。我需要为每个用户生成一个令牌并将其保存到数据库中:

var crypto = require('crypto');
db.users.find({}).exec(function(users){
    users.forEach(function(user){
       user.token = crypto.randomBytes(32).toString('hex');
       user.save();
    });
});

我总是对异步方法感到困惑,只是无法理解它们是如何工作的......所以这段代码不起作用,因为它在save()调用完成之前就存在了。你会如何使它工作?你会如何等待所有save()˙calls并打印Done!来控制?

谢谢!

1 个答案:

答案 0 :(得分:2)

Mongoose find函数返回一个promise,你可以用它来创建链。 Promise.all生成promises(或者promises和values的混合),遍历所有值并返回在数组中的所有项都满足时满足的promise。

var crypto = require('crypto');

db.users
    .find({})
    .then(users => {
      var ops = users.map(user => {
       user.token = crypto.randomBytes(32).toString('hex');
       return user.save();
      });
      return Promise.all(ops);
    })
    .then(() => console.log('done'))
    .catch(err => console.log('error' + err));
});