简体   繁体   中英

Sequelize: delete JSONB property (with PostgreSQL)

I'm using sequelize (v3.12.2), with pg (4.4.3), PostgreSQL (v9.4), and Node (v4.1.2).

I have a model that inlcudes a JSONB data type field.

var User = {
  data: {
    type: Sequelize.JSONB
}

Now I can do

User.findOne({where: {id: 12345}})
  .update({data: {x: 'foo'}});

And

User.findOne({where: {id: 12345}})
  .update({'data.y': 'bar'});

Now, if I want to delete just the data.x property how can I do it in one command?

User.findOne({where: {id: 12345}})
  .update({'data.x': null});

Obviously doesn't work. In fact, the resulting data object should be:

{y: 'bar'}

And not:

{x: null, y: 'bar'}

How can I do this with Sequelize? Thanks for your help!

If @Tarun Lalwani's code does not work, probably Your postgresql 9.4 does not support "-" operation.

In that case, creating function or upgrade to 9.5+ would be your option.

See PostgreSQL: Remove attribute from JSON column

I think below should work

User.findOne({where: {id: 12345}})
  .update({'data': sequelize.literal("data - 'x' ")});

Have not tested it, but if it doesn't work let me know. The solution will be along these lines only

Try this:

User.update({
        "data": sequelize.literal("data - 'x' ") 
    }, {
        where: {
            id: 12345
        }
    });

With Sequelize 6 (and maybe earlier), you can do the following on your model instance:

 delete myRecord.jsonBField.keyName; 

Then call changed (required) to mark the field as changed and save:

 myRecord.changed("jsonBField", true);
 myRecord.save();`

Alternatively, you can call myRecord.set("jsonBField.keyName", null) to set the key to null, which will automatically mark the field as changed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM