在JSONB中续订更新嵌套属性

时间:2017-07-24 18:23:41

标签: sequelize.js jsonb

我正在寻找一种只更新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}
}

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

我尝试了以下代码:

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使用单个更新查询执行此操作?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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()

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