ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Обновление или добавление документа в Mongoose: save(), update()

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для реализации операций вставки или обновления документов в Mongoose, воспользуйтесь методом findOneAndUpdate() с установленным параметром { upsert: true }. При его использовании, документ будет обновлён, если найдено совпадение, иначе будет вставлен новый:

JS
Скопировать код
const filter = { name: 'Джон Доу' }; 
const update = { age: 30 }; 

Model.findOneAndUpdate(filter, update, { upsert: true, new: true }, (err, doc) => {
  if (err) console.error(err); 
  console.log('Результат:', doc);
});
Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Использование {new: true} для получения актуальных результатов

Параметр { new: true } незаменим, если требуется получить обновлённый документ в ответ, вместо возврата исходного.

Осуществление отслеживания временных интервалов при помощи createdAt и updatedAt

Автоматическое отслеживание и обновление временных меток createdAt и updatedAt происходит с использованием параметра timestamps в определении схемы:

JS
Скопировать код
const schema = new mongoose.Schema({
  // поля вашей схемы
}, { timestamps: true });

Точечное обновление полей при помощи update()

Для осуществления точных изменений конкретных полей, используйте метод Model.update() с указанием { upsert: true }:

JS
Скопировать код
const conditions = { name: 'Джон Доу' };
const update = { $set: { age: 30 } };

Model.update(conditions, update, { upsert: true }, (err) => {
  // Обработка результата.
});

Как избежать дублирования _id при вставке

Прежде чем добавить новый документ, удалите поле _id для исключения ошибок, связанных с его дублированием:

JS
Скопировать код
let upsertData = contact.toObject();
delete upsertData._id;

Model.findOneAndUpdate(filter, upsertData, { upsert: true }, (err, doc) => {
  // Обработка результата.
});

Надёжный, но медленный метод findOne + save()

В тех случаях, когда требуется выполнить операции, ассоциированные с использованием промежуточной программы или хуков, применяйте комбинацию методов findOne и save():

JS
Скопировать код
Model.findOne({ name: 'Джон Доу' }, (err, doc) => {
  if (doc) {
    doc.age = 30;
    doc.save();
  } else {
    const newDoc = new Model({ name: 'Джон Доу', age: 30 });
    newDoc.save();
  }
});

Помните о необходимости аккуратного использования данного метода, так как он реализует вдвое больше запросов к базе данных.

Как избежать предупреждений об устаревании findOneAndUpdate

Чтобы предотвратить появление предупреждений об устаревании,ич установите { useFindAndModify: false }:

JS
Скопировать код
mongoose.set('useFindAndModify', false);

Визуализация

Представьте ваш документ как пазл, который вам предстоит собрать:

🧩 1, 🧩 2, ?

Метод вставки позволяет дополнить или заменить недостающий элемент:

🧩 1, 🧩 2, 🧩 3

Таким образом завершается процесс работы с вашим документом в Mongoose.

Применение Model.updateOne() для уникальных случаев

В случае обновления документа с уникальным свойством, рекомендуется применять метод Model.updateOne():

JS
Скопировать код
const filter = { email: 'unique@example.com' };
const update = { subscribed: true };

Model.updateOne(filter, update, { upsert: true }, (err, result) => {
  // Ваше великолепие в действии!
});

Что если применить функцию Model.upsert()?

Использование функции Model.upsert() могло бы значительно упростить процесс вставки или обновления, открывая новые горизонты для инноваций.

Руководства для дальнейшего изучения

Для более глубокого изучения и совершенствования навыков работы с операциями вставки и обновления, используйте обучающие материалы и документацию Mongoose.

Полезные материалы

  1. Как обновить или вставить документ в Mongoose? – Stack Overflow
  2. Mongoose v8.1.1: Ссылка на API
  3. Mongoose v8.1.1: Учебные руководства Mongoose: Как использовать findOneAndUpdate() в Mongoose
  4. Руководство по MongoDB: $set
  5. Операторы обновления — Руководство по MongoDB
  6. Mongoose v8.1.1: Модели