【问题标题】:Callbacks with node.js/MongoDB/Mongoose使用 node.js/MongoDB/Mongoose 进行回调
【发布时间】:2011-09-22 03:14:51
【问题描述】:

我正在尝试学习用于 MongoDB 和 node.js 的 Mongoose ORM。我想在我的数据库中查询文档,对每个文档执行一个操作,然后在之前的所有操作完成后执行另一个操作。换句话说,我想做这样的事情,假设我有一个名为“用户:”的模型

var userArray = [];
User.find({})
.each(function(user) {
    user.age += 1;
    userArray.push(user);
})
.then(function() {
    //do something with userArray
    //happens after all the users' ages are modified
});

在 Mongoose 中执行此类操作的正确语法是什么?

【问题讨论】:

    标签: mongodb node.js mongoose


    【解决方案1】:

    如果您只需要对每个文档执行同步操作,则解决方案相当简单。 (console.warn() 是同步的,因此您可以使用它来验证是否首先处理了所有用户对象。)

    User.find({}).execFind(function(err, users) {
         users.forEach(function(user) {
              user.age += 1;
              userArray.push(user);
              console.warn('x');
         });
         // then...
         console.warn('y');
    });
    

    如果您需要执行某种异步操作(可能是另一个数据库查询),则解决方案会变得更加复杂。我最近遇到了这个问题,并简要讨论了使用 Step 之类的模块或滚动我自己的准系统解决方案。 Step 提供了比我需要的更多的功能,所以我认为增加的开销是不值得的。这是我的解决方案:

        var count = 0;
    A.find({ b : c }, ['d', 'e', 'f']).sort(['d'], -1).execFind(function(err, g) {
        g.forEach(function(h) {
            h.a = [];
            B.find({ b : c }, ['d', 'e', 'f', 'g']).execFind(function(err, z) {
                g.v = z;
                if (++count == g.length)
                    res.render('z.jade', { locals : { title : 'Q', j : g } });
            });
        });
    });
    

    请原谅我的混淆(我从一个未公开的项目的源代码中提取了这一点)。本质上,您要等到最后的异步操作完成。

    【讨论】:

      【解决方案2】:

      有这方面的模块。尝试使用异步(https://github.com/caolan/async)。它允许运行命令,然后在所有完成后执行回调。

      async.parallel([
          function(){ ... },
          function(){ ... }
      ], callback);
      

      【讨论】:

        猜你喜欢
        • 2014-11-19
        • 2017-01-10
        • 2016-05-01
        • 1970-01-01
        • 2015-11-06
        • 1970-01-01
        • 2015-11-20
        • 1970-01-01
        • 2016-06-03
        相关资源
        最近更新 更多