Обновляйте только определенные значения с помощью updateOne$, установленного в мангусте

#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…