2015-02-23 46 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操作。