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