在JSONB中续集更新嵌套属性

Ali*_*fat 1 sequelize.js jsonb

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

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

当前data列值:

{
 'email':{'verified':false,'token':'random token'},
 'phone:{'verified':true}
}
Run Code Online (Sandbox Code Playgroud)

我想将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()...
Run Code Online (Sandbox Code Playgroud)

更新的列将是:

{
 'email':{'verified':true},
}
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

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

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

是否可以通过sequelize单个更新查询来执行此操作?

Nar*_*aki 15

模型。yourJsonB .userName

model.yourJsonB.userName = "Lisa" // traditional prop change
model.changed("yourJsonB", true)   // << forces sequelize to understand this json has been updated
await model.save()
Run Code Online (Sandbox Code Playgroud)

我在这里找到了这个: https: //sequelize.org/master/manual/upgrade-to-v6.html


Win*_*uen 5

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

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