Sequelize: удалить свойство JSONB (с PostgreSQL)

Я использую sequelize (v3.12.2) с pg (4.4.3), PostgreSQL (v9.4) и Node (v4.1.2).

У меня есть модель, которая включает поле типа данных JSONB.

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

Теперь я могу сделать

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

А также

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

Теперь, если я хочу удалить только свойство data.x, как я могу сделать это одной командой?

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

Очевидно не работает. Фактически, результирующий объект данных должен быть:

{y: 'bar'}

И не:

{x: null, y: 'bar'}

Как я могу сделать это с помощью Sequelize? Спасибо за вашу помощь!


person Pensierinmusica    schedule 20.10.2015    source источник
comment
Вы нашли решение?   -  person Ali Sherafat    schedule 18.07.2017
comment
Я думаю, что проще восстановить весь json-объект в jsonb-поле .. (но, может быть, это не так эффективно)   -  person Leonid Dashko    schedule 25.03.2018


Ответы (3)


Если код @Tarun Lalwani не работает, возможно, ваш postgresql 9.4 не поддерживает операцию «-».

В этом случае вашим вариантом будет создание функции или обновление до 9.5+.

См. PostgreSQL: удалить атрибут из столбца JSON

person John    schedule 10.09.2019
comment
@Shamoon, вы это читали? https://stackoverflow.com/questions/23490965/postgresql-remove-attribute-from-json-column - person John; 12.09.2019
comment
не могли бы вы добавить соответствующую информацию к своему ответу, чтобы этот пост был законченным? - person Shamoon; 13.09.2019
comment
Тип JSONB - это тип данных postgresql. Последовательность - это ORM-преобразователь в БД. Если postgresql (9.4) не поддерживает определенные операции, такие как - для JSONB, вы также не можете использовать эти операции в сопоставителе ORM. Но начиная с v9.5 поддерживают работу, а в Sequence - операцию работают. - person John; 14.09.2019

Я думаю, что ниже должно работать

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

Не тестировал, но если не сработает, дайте мне знать. Решение будет только по этим линиям

person Tarun Lalwani    schedule 07.09.2019

Попробуй это:

User.update({
        "data": sequelize.literal("data - 'x' ") 
    }, {
        where: {
            id: 12345
        }
    });
person piyushkantm    schedule 12.09.2019
comment
Чем это отличается от существующего ответа? - person Tarun Lalwani; 12.09.2019
comment
Он обновляет базу данных в одном запросе. Пока ваш делает 2 запроса. 1 для получения данных и второй для обновления. - person piyushkantm; 16.09.2019
comment
Это более практично, потому что он может массово обновлять любое количество записей с помощью одного запроса. - person GavinBelson; 19.06.2020