Обновление или добавление документа в Mongoose: save(), update()
Быстрый ответ
Для реализации операций вставки или обновления документов в Mongoose, воспользуйтесь методом findOneAndUpdate() с установленным параметром { upsert: true }. При его использовании, документ будет обновлён, если найдено совпадение, иначе будет вставлен новый:
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);
});

Использование
Параметр { new: true } незаменим, если требуется получить обновлённый документ в ответ, вместо возврата исходного.
Осуществление отслеживания временных интервалов при помощи
Автоматическое отслеживание и обновление временных меток createdAt и updatedAt происходит с использованием параметра timestamps в определении схемы:
const schema = new mongoose.Schema({
// поля вашей схемы
}, { timestamps: true });
Точечное обновление полей при помощи
Для осуществления точных изменений конкретных полей, используйте метод Model.update() с указанием { upsert: true }:
const conditions = { name: 'Джон Доу' };
const update = { $set: { age: 30 } };
Model.update(conditions, update, { upsert: true }, (err) => {
// Обработка результата.
});
Как избежать дублирования
Прежде чем добавить новый документ, удалите поле _id для исключения ошибок, связанных с его дублированием:
let upsertData = contact.toObject();
delete upsertData._id;
Model.findOneAndUpdate(filter, upsertData, { upsert: true }, (err, doc) => {
// Обработка результата.
});
Надёжный, но медленный метод
В тех случаях, когда требуется выполнить операции, ассоциированные с использованием промежуточной программы или хуков, применяйте комбинацию методов findOne и save():
Model.findOne({ name: 'Джон Доу' }, (err, doc) => {
if (doc) {
doc.age = 30;
doc.save();
} else {
const newDoc = new Model({ name: 'Джон Доу', age: 30 });
newDoc.save();
}
});
Помните о необходимости аккуратного использования данного метода, так как он реализует вдвое больше запросов к базе данных.
Как избежать предупреждений об устаревании
Чтобы предотвратить появление предупреждений об устаревании,ич установите { useFindAndModify: false }:
mongoose.set('useFindAndModify', false);
Визуализация
Представьте ваш документ как пазл, который вам предстоит собрать:
🧩 1, 🧩 2, ?
Метод вставки позволяет дополнить или заменить недостающий элемент:
🧩 1, 🧩 2, 🧩 3
Таким образом завершается процесс работы с вашим документом в Mongoose.
Применение
В случае обновления документа с уникальным свойством, рекомендуется применять метод Model.updateOne():
const filter = { email: 'unique@example.com' };
const update = { subscribed: true };
Model.updateOne(filter, update, { upsert: true }, (err, result) => {
// Ваше великолепие в действии!
});
Что если применить функцию
Использование функции Model.upsert() могло бы значительно упростить процесс вставки или обновления, открывая новые горизонты для инноваций.
Руководства для дальнейшего изучения
Для более глубокого изучения и совершенствования навыков работы с операциями вставки и обновления, используйте обучающие материалы и документацию Mongoose.


