Model.findOneAndUpdate() больше не принимает обратный вызов?

Да, начиная с версии Mongoose 4.0 и выше, метод findOneAndUpdate() больше не принимает обратный вызов как аргумент. Вместо этого, он возвращает объект Query, который позволяет вам выполнять различные операции с помощью методов цепочки.

Вот как можно использовать новый синтаксис findOneAndUpdate():

const MyModel = mongoose.model('MyModel', mySchema);

MyModel.findOneAndUpdate({ name: 'John' }, { age: 30 })
  .then((document) => {
    // Объект document содержит результат обновления
    console.log(document);
  })
  .catch((err) => {
    // Обработка ошибок
    console.error(err);
  });

В примере выше мы вызываем findOneAndUpdate(), передавая фильтр для поиска объекта с именем «John» и обновления, которое мы хотим выполнить (изменение поля age на 30). Затем мы вызываем метод .then() для обработки успешного выполнения запроса и метод .catch() для обработки ошибок, если они возникнут.

Теперь, когда findOneAndUpdate() возвращает объект Query, вы можете продолжать цепь методов для выполнения дополнительных операций, таких как сортировка, обновление нескольких полей и другие. Вот пример цепочки методов:

MyModel.findOneAndUpdate({ name: 'John' }, { age: 30 })
  .sort('-createdAt')
  .limit(10)
  .exec()
  .then((documents) => {
    // Объект documents содержит результаты запроса
    console.log(documents);
  })
  .catch((err) => {
    // Обработка ошибок
    console.error(err);
  });

В этом примере мы добавляем метод .sort() для сортировки результатов по убыванию даты создания, метод .limit() для ограничения количества возвращаемых документов до 10 и метод .exec() для выполнения запроса. Затем мы обрабатываем результаты запроса в блоке .then() и обрабатываем ошибки в блоке .catch().

Таким образом, с помощью нового синтаксиса findOneAndUpdate() в Mongoose 4.0 и выше, вы можете выполнять более гибкие и разнообразные операции обновления данных в MongoDB.