如何在YugaByte DB的JSONB列中更新属性并添加新属性?

时间:2019-01-29 21:56:10

标签: json database yugabyte-db

我正在尝试YugaByte的Cassandra API(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:

是否支持此功能?如果正确,语法是什么?

1 个答案:

答案 0 :(得分: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,如果该属性/字段已存在,则YugaByte DB当前(自1.1版起)允许更新特定属性,但不允许将新属性添加到现有JSONB列中。如果您需要后者,你需要阅读旧值到应用程序,并写在全部新的JSON。