Найти и удалить Mongoose

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

Data.find(query).exec(function(err, data)
{
    Data.remove(query).exec(function(err2)
    {
        ActionCtrl.saveRemove(data);
    });
});

Есть ли лучший способ? В этом сообщении: Как удалить документы с помощью Node.js Mongoose? было предложено использовать find(). Remove(). Exec():

Data.find(query).remove().exec(function(err, data)
{
    ActionCtrl.saveRemove(data);
});

Однако data обычно 1, не спрашивайте меня, почему. Могу ли я сделать это без бесконечного гнездования моих запросов? Спасибо!

Ответ 1

Как вы уже отметили, использование следующего документа не вернет документ:

Data.find(query).remove().exec(function(err, data) {
  // data will equal the number of docs removed, not the document itself
}

Таким образом, вы не можете сохранить документ в ActionCtrl, используя этот подход.

Вы можете достичь того же результата, используя оригинальный подход, или использовать некоторую форму итерации. Для обработки асинхронных вызовов может понадобиться библиотека потока управления, например async. Он не уменьшит ваш код, но уменьшит количество запросов. Пример:

Data.find(query, function(err, data) {
  async.each(data, function(dataItem, callback) {
    dataItem.remove(function(err, result) {
      ActionCtrl.saveRemove(result, callback);
    });
  });
});

Этот ответ предполагает, что реализация ActionCtrl.saveRemove() может принимать отдельный документ в качестве параметра и может выполнять обратный вызов из цикла async.each. async.each требует, чтобы обратный вызов запускался без аргументов в конце каждой итерации, поэтому вы идеально выполнили бы это в конце .saveRemove()

Обратите внимание, что метод remove в отдельном документе фактически вернет документ, который был удален.