Подтвердить что ты не робот

Mongoose удаляет сразу несколько данных

У меня есть большой список идентификаторов, которые я хочу удалить из mongodb из нескольких моделей. Основная идея заключается в том, что у меня одинаковый идентификатор документа в нескольких схемах, и я хотел бы удалить документ из каждой модели. Я делаю это так:

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

Проблема в том, что у меня есть 14000+ идентификаторов в wrongList, и запрос работает, но для завершения требуется много времени... как увеличить время удаления? Можно ли удалить пакет или что-то в этом роде?

4b9b3361

Ответ 2

Предполагая, что вы используете lo-dash, вы можете получить коллекцию идентификаторов item с помощью функции _.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 уменьшит количество вызовов db по одному на каждую коллекцию. Затем async.parallel будет запускать задачи параллельно и последним, remove непосредственно из модели удалит операцию find для каждой коллекции.