#node.js #express #mongoose
Вопрос:
Я хочу обновить только два значения внутри задачи в приведенной ниже модели Мангуста
const userSchema = new mongoose.Schema({
name: String,
email: String,
phone: Number,
points: Number,
todo: {
}
})
Задача на самом деле содержит 11 значений, и я хочу обновлять только 2 значения за раз, которые я получаю от интерфейса
let {
t,
i
} = req.body.delitem;
await User.updateOne({
username: req.body.user
}, {
$set: {
todo: {
[t]: "",
[i]: ""
}
}
})
но происходит то, что эти два поля становятся пустыми строками, но остальные поля также меняются на NULL
, в то время как я хочу, чтобы другие поля оставались прежними.
Ответ №1:
Используйте точечную нотацию, как это:
await User.updateOne({username:req.body.user},
{
"$set": {
"todo.t": "",
"todo.i": ""
}
})
Пример здесь
Если вы используете объект, $set
вы говорите монго заменить объект новым.
Комментарии:
1. Да, на самом деле он правильно обновляет значения, но он создает новые поля с именами i и t , если я использую
"todo.[i]"
, все равно он создает новое поле с именем [i]. Он должен динамически меняться в зависимости от конкретных ситуаций. Реальные поля похожи на t1,t2…. аналогично i1,i2…
Ответ №2:
Я полагаю, что ваша проблема заключается в том, что вы используете $set и передаете целый объект, который перезаписывает все задачи с вашими t
i
полями и, и вы применили требования к этим другим полям.
Если вы видите документы в mongo за $set, вы можете вместо этого обновить определенные поля в подобъектах. Следующий фрагмент должен быть более подходящим.
let {t,i} = req.body.delitem;
await User.updateOne({username:req.body.user}, {
$set: {
"todo.t": "",
"todo.i": ""
}
})
Комментарии:
1. Да, на самом деле он правильно обновляет значения, но создает новые поля с именами i и t, если я использую «todo.[i]», все равно он создает новое поле с именем [i]. Он должен динамически меняться в зависимости от данных ситуаций. Реальные поля подобны t1,t2…. аналогично i1,i2…