【问题标题】:Sequelize update nested property in JSONB续集更新 JSONB 中的嵌套属性
【发布时间】:2017-12-30 10:45:29
【问题描述】:

我正在寻找一种仅更新 jsonb 列内的嵌套键/值的方法。
这是User 模型:

const User= sequelize.define('User', {
    id: DataTypes.INTEGER,
    name:DataTypes.STRING,
    // other fields
    data: DataTypes.JSONB
});

当前data 列值:

{
 'email':{'verified':false,'token':'random token'},
 'phone:{'verified':true}
}

我想使用单个 update 查询将email.verified 属性更新为true

我尝试了以下代码:

models.User.update({'data.email.verified':true},
       {where:{id:1}}).then()...

models.User.update({data:{email:{verified:true}}},
       {where:{id:1}}).then()...

更新后的列是:

{
 'email':{'verified':true},
}

我也试过这个:

models.User.findById(1).then(user => {
    user.set('data.email.verified', true);
    user.save().then()...
});

这可行,但我不想执行两个查询(选择然后更新)只更新一个字段。

是否可以使用 sequelize 和单个更新查询来做到这一点?

【问题讨论】:

    标签: sequelize.js jsonb


    【解决方案1】:

    是的,您可以使用单个更新查询通过 sequelize 更新嵌套的 json 属性,但您必须使用原始查询。

    sequelize.query(`UPDATE users SET data = jsonb_set(data, '{email,verified}', 'true', true) WHERE id = 1`);
    

    【讨论】:

      【解决方案2】:

      model.yourJsonB.userName

      model.yourJsonB.userName = "Lisa"  // traditional prop change
      model.changed("yourJsonB",true)   //< forces sequelize to understand this json has be updated
      model.save()
      

      我在文档中找到了 res: https://sequelize.org/master/manual/upgrade-to-v6.html

      【讨论】:

      • 有效,但您必须像 await model.save() 一样在保存时添加 await 。谢谢
      • 完美运行,太棒了!
      猜你喜欢
      • 2021-07-21
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多