Обновите коллекцию и отправьте электронное письмо, если выполнены условия || Монго Нодейс [дубликаты]

1

У меня есть следующий случай - я хочу перебрать каждый элемент в БД и:

  • если элемент имеет bumped поле, установленное в false
  • и дата создания менее 30 дней назад

затем:

  • установить bumped с true
  • отправить письмо пользователю!

Мой подход:

User.updateMany(
     {
        bumped: false,
        creationDate: {
           $gte: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
        },
     },
     {
        $set: {
           bumped: true,
        },
     },
     (err, res) => {
        // 
        // What is "res" here? <====== question
     },
  );

Мой вопрос - что такое аргумент res в функции обратного вызова?

Вопрос2: будет ли выполняться обратный вызов только для этих элементов, которые удовлетворяют условию?

Спасибо вам большое!

Теги:
mongoose

1 ответ

0

Функция updateMany не возвращает обновленные документы. Возвращает только количество обновленных документов.

Поэтому единственное, что вы можете здесь сделать, - это сначала найти все документы и выполнить итерацию один за другим, а затем вызвать функцию отправки почты.

const users = await User.find({
  "bumped": false,
  "creationDate": {
    "$gte": new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
  }
})

const promises = users.map(async(user) => {
  await User.updateOne({ _id: user._id }, { $set: { bumped: true }})
  // Here you can write your send mail function
})

await Promise.all(promises)
  • 0
    Спасибо. Тем не менее, я думаю, что const users = User.find(...) не нуждается в ключевом слове await . Или я не прав? Даже компилятор жалуется на это - «Await должен использоваться внутри функции Async»
  • 0
    Вы должны использовать await только с async функцией

Ещё вопросы

Сообщество Overcoder
Наверх
Меню