2011-06-24 158 views
1

我想了解MongoDB ORM MongoDB和node.js。我想查詢數據庫中的文檔,對每個文檔執行一個操作,然後在所有先前的操作完成後再執行另一個操作。換句話說,我想要做這樣的事情,假設我有一個名爲「用戶:」模型node.js/MongoDB/Mongoose回調

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 
}); 

哪些是貓鼬做這樣的事情的正確語法?

回答

2

如果您只需要爲每個文檔執行同步操作,則解決方案非常簡單。 (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 } }); 
     }); 
    }); 
}); 

請原諒混淆(我猛地這一權利從一個項目,是下包裹的來源)。從本質上講,您需要等到最後的異步操作才能完成。

1

這裏有模塊。嘗試使用異步(https://github.com/caolan/async)。它允許運行命令,然後在完成所有操作後執行回調。

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