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.
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.