作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在试用 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:
这是否受支持,如果支持,正确的语法是什么?
最佳答案
更新字符串值时,您必须将新值用双引号括在单引号内。例如:
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。
关于json - 如何更新属性并在 YugaByte DB 的 JSONB 列中添加新属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54430212/
我是一名优秀的程序员,十分优秀!