Mongoose一次删除多个数据

时间:2015-02-23 10:09:58

标签: node.js mongodb mongoose

我有一个很大的id列表,我想从mongodb中删除多个模型,主要思想是我对多个模式中的文档具有相同的id,我想从每个模型中删除一个文档。我是这样做的:

_.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多个ID并且查询有效但是需要花费很多时间才能完成...我怎样才能增加删除的时间?我可以批量删除或类似的东西吗?

2 个答案:

答案 0 :(得分:23)

我认为你可以使用mongodb的$ in运算符。

http://docs.mongodb.org/manual/reference/operator/query/in/

类似的东西:

UTUSTP.remove({_id: {$in: wronglist}}, function(){...}); // and so on

答案 1 :(得分:16)

假设您正在使用lo-dash,您可以使用item功能获取_.pluck ID的集合。我们称之为idsArray。 现在,您可以在async.parallel调用中使用$in运算符,直接在模型中使用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会将db调用减少到每个集合一个。然后async.parallel将并行运行任务,最后,直接来自模型的remove将删除每个集合的find操作。