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

标签 json database yugabytedb

我正在试用 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/

相关文章:

yugabytedb - MYSQL与MYSQL的性能差异

database - YugaByte DB 中的临时表

ios - 如何将特定 NSMutableArray 中的数据重新加载到 UITableView 中

jquery - 为 Controller 检索模型数据存在巨大的 XHR 延迟

javascript - 使用 Angular foreach 循环重新排列 JSON

php - 使用 PHP 脚本读取 json 文件并打印输出

sql - postgresql 从选择中插入

php - 婚礼网站RSVP数据库

android - 对 SQLiteOpenHelper 和创建多个表感到困惑

yugabytedb - YSQL 和 YCQL 相互兼容吗?