【问题标题】:Only update specific values using updateOne $set in mongoose仅在猫鼬中使用 updateOne $set 更新特定值
【发布时间】:2021-09-13 21:37:51
【问题描述】:

我只想在下面的 Mongoose 模型中更新 todo 内的两个值

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 而我希望其他字段保持不变。

【问题讨论】:

    标签: node.js express mongoose


    【解决方案1】:

    像这样使用点符号:

    await User.updateOne({username:req.body.user},
    {
      "$set": {
        "todo.t": "",
        "todo.i": ""
      }
    })
    

    例如here

    如果你在$set 中使用一个对象,你就是在告诉 mongo 用新对象替换该对象。

    【讨论】:

    • 是的,实际上它正确地更新了值,但是它正在创建名为 i 和 t 的新字段,如果我使用 "todo.[i]",它仍然会创建一个名为 [i] 的新字段。它应该在给定的情况下动态变化。真实字段就像 t1,t2.... 类似 i1,i2...
    【解决方案2】:

    我相信您的问题是您正在使用 $set 并传递一个完整的对象,该对象用您的 ti 字段覆盖整个待办事项,并且您已在其他字段上强制执行。

    If you see the docs 在 mongo for $set 中,您可以改为更新子对象中的特定字段。下面的sn-p应该比较合适。

    let {t,i} = req.body.delitem;
    await User.updateOne({username:req.body.user}, {
      $set: { 
        "todo.t": "",
        "todo.i": ""
      }
    })
    

    【讨论】:

    • 是的,实际上它正确地更新了值,但是它正在创建名为 i 和 t 的新字段,如果我使用“todo.[i]”,它仍然会创建一个名为 [i] 的新字段。它应该在给定的情况下动态变化。真实字段就像 t1,t2.... 类似 i1,i2...
    猜你喜欢
    • 2023-03-09
    • 2019-01-23
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2019-05-04
    • 2012-03-28
    相关资源
    最近更新 更多