2015-02-23 501 views
10

我有一個很大的id列表,我想從多個模型中刪除mongodb,主要想法是我有多個模式中的文檔的相同id,我想刪除一個來自每個模型的文件。我這樣做是這樣的:Mongoose一次刪除多個數據

_.each(wrongList, function(item) { 
     UPUSTP.find({id: item.id}).remove(function(err) { 
      if (err) 
       console.log("Error while deleting " + err.message); 
     }) 

     UPUANAM.find({id: item.id}).remove(function(err) { 
      if (err) 
       console.log("Error while deleting " + err.message); 
     }) 

     UPUEXE.find({id: item.id}).remove(function(err) { 
      if (err) 
       console.log("Error while deleting " + err.message); 
     }) 

     UPUEXO.find({id: item.id}).remove(function(err) { 
      if (err) 
       console.log("Error while deleting " + err.message); 
     }) 

     UPUPROC.find({id: item.id}).remove(function(err) { 
      if (err) 
       console.log("Error while deleting " + err.message); 
     }) 
    }) 

的問題是,我在wrongList和查詢工作14000+ IDS,但它需要花費大量的時間來完成...我怎樣才能增加的時間去掉?我可以批量移除或類似的東西嗎?

回答

15

假設你正在使用lo-dash,你可以得到的item ID的集合與_.pluck功能。我們稱之爲idsArray。 現在你可以使用$in運營商,在async.parallel調用,直接使用remove從你的模型,如:

async.parallel({ 
    function (callback) { 
    UPUSTP.remove({ id: { $in: idsArray } }, function (err) { 
     if (err) return callback("Error while deleting " + err.message); 
     callback(null, "Some useful message here..."); 
    }); 
    }, 
    . // do the same with the other collections 
    . 
    . 
    function (err, result) { 
    // check the error and do somethin useful with the results 
    } 

首先,$in將減少數據庫調用每一個集合。然後async.parallel將並行運行任務,最後,直接從模型中的remove將刪除每個集合的find操作。