Чтобы обновить поле во внедренном документе, вы должны использовать оператор $set
(поскольку ваш документ - это объект, мы имеем дело с объектом внутри объекта)
Из документации mongodb:
https://docs.mongodb.com/v2.4/reference/method/db.collection.update/#update -specifi c -fields-in-Встроенные-документы
Обновить Specifi c Поля во встроенных документах Используйте точечную нотацию для обновить значения во встроенных документах.
Так что для вас, , если мы предположим, что req.body здесь { darkMode: true }
, это будет
const profile = await Profile.findByIdAndUpdate(
req.params.id,
{ $set: { 'settings.darkMode': req.body.darkMode } },
{
new: true,
runValidators: true
});
Но все зависит от того, как вы отправляете данные от клиента; если вы отправляете объект, содержащий только измененные поля, то вы должны специально установить $ set, чтобы сохранить другое значение без изменений, как описано выше. Чтобы автоматизировать это, вы также можете создать свой запрос, используя причудливый l oop:
let query = { $set: {} }
Object.keys(req.body).forEach(requestBodyKey => {
let requestBodyFieldValue = req.body[requestBodyKey];
query.$set[`settings.${requestBodyKey}`] = requestBodyFieldValue;
})
. Или вы можете сначала запросить свой документ, чтобы получить current_settings, затем, используя javascript, вы объедините два объекта ( например, {...myCurrentSettings, ...myNewerSettings }
см. оператор распространения или Object.assign () ), а затем обновите его, чтобы обеспечить сохранение предыдущих, нетронутых значений полей.