Как обновить атрибут и добавить новый атрибут в столбец JSONB в базе данных YugaByte?

Я пробую API YugaByte Cassandra (YCQL) и заинтересован в использовании расширений типа данных JSONB.

Но у меня возникают проблемы как с обновлением атрибута в существующем столбце JSONB, так и с добавлением нового атрибута в существующий столбец JSONB.

Поддерживается ли это в YugaByte? Вот что я пробовал:

Рассмотрим следующий пример, в котором есть одна строка с простым ключом и столбец JSONB.

cqlsh:k> CREATE TABLE T (key int PRIMARY KEY, value jsonb);
cqlsh:k> INSERT INTO T(key, value) VALUES(1, '{"author": "Charles", "title": "Hello World"}');
cqlsh:k> SELECT * FROM T;

 key | value
-----+--------------------------------------------
   1 | {"author":"Charles","title":"Hello World"}

(1 rows)

Все идет нормально.

Если я попытаюсь обновить существующий атрибут внутри документа, я увижу следующую ошибку:

cqlsh:k> UPDATE T SET value->'author' = 'Bruce' WHERE key=1;
InvalidRequest: Error from server: code=2200 [Invalid query] message="SQL error: \
Invalid Arguments. Corruption: JSON text is corrupt: Invalid value.

Если я попытаюсь добавить новый атрибут в существующий атрибут JSONB, я получу следующую ошибку:

cqlsh:k> UPDATE T SET value->'price' = '10' WHERE key=1;
InvalidRequest: Error from server: code=2200 [Invalid query] message="SQL error: \
Execution Error. Could not find member:

Поддерживается ли это, и если да, то каков правильный синтаксис?


person Srinath    schedule 29.01.2019    source источник


Ответы (1)


При обновлении строкового значения вы должны заключить новое значение в двойные кавычки внутри одинарных кавычек. Например:

cqlsh:k> UPDATE T SET value->'author' = '"Bruce"' WHERE key=1;
cqlsh:k> SELECT * FROM T;

 key | value
-----+------------------------------------------
   1 | {"author":"Bruce","title":"Hello World"}

(1 rows)

Что касается второго вопроса о возможности добавления новых атрибутов:

Для UPDATE в настоящее время (начиная с 1.1) YugaByte DB позволяет обновлять определенные атрибуты, если этот атрибут/поле уже существует, но не позволяет добавлять новые атрибуты в существующий столбец JSONB. Если вам нужно последнее, вам нужно прочитать старое значение в приложении и полностью записать новый json.

person Alan    schedule 30.01.2019