我正在尝试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:
是否支持此功能?如果正确,语法是什么?
答案 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。