YugabyteDB YCQL中的JSONB数据类型深度解析

YugabyteDB YCQL中的JSONB数据类型深度解析

yugabyte-db yugabyte/yugabyte-db: 是 YugaByte DB 的官方仓库,一个高性能、高可扩展、分布式的 SQL 数据库,支持 PostgreSQL 兼容性。适合对分布式数据库、SQL 数据库和云原生应用的开发者。 yugabyte-db 项目地址: https://gitcode.com/gh_mirrors/yu/yugabyte-db

什么是JSONB数据类型

JSONB是YugabyteDB YCQL中用于存储JSON(JavaScript Object Notation)数据的二进制格式数据类型。与普通文本格式存储JSON相比,JSONB具有以下优势:

  1. 数据验证:自动确保存储的值符合JSON规范
  2. 高效存储:二进制格式占用空间更小
  3. 操作优化:提供专门的JSON操作函数和运算符
  4. 去重处理:自动去除重复的键,只保留最后一个值

创建包含JSONB列的表

在YCQL中创建包含JSONB列的表非常简单:

-- 创建keyspace
CREATE KEYSPACE store;

-- 创建包含JSONB列的表
CREATE TABLE store.books (
  id int PRIMARY KEY,
  details jsonb
);

插入JSONB数据

我们可以插入完整的JSON文档:

INSERT INTO store.books (id, details) VALUES
  (1, '{ 
    "name": "Macbeth", 
    "author": { 
      "first_name": "William", 
      "last_name": "Shakespeare" 
    }, 
    "year": 1623, 
    "editors": ["John", "Elizabeth", "Jeff"] 
  }');

JSONB查询操作

基本查询

查询所有数据:

SELECT * FROM store.books;

使用箭头操作符查询

YCQL提供了两种箭头操作符用于访问JSON对象的属性:

  1. -> 返回JSON对象
  2. ->> 返回文本值

示例1:查询特定作者的书

SELECT * FROM store.books 
WHERE details->'author'->>'first_name' = 'William' 
AND details->'author'->>'last_name' = 'Shakespeare';

示例2:查询特定编辑处理过的书

SELECT * FROM store.books 
WHERE details->'editors'->>0 = 'Mark';

示例3:类型转换查询

SELECT * FROM store.books 
WHERE CAST(details->>'year' AS integer) = 1950;

JSONB更新操作

完整文档更新

UPDATE store.books 
SET details = '{
  "author":{"first_name":"Carl","last_name":"Sagan"},
  "editors":["Ann","Rob","Neil"],
  "genre":"science",
  "name":"Cosmos",
  "year":1980
}' 
WHERE id = 1;

部分更新

更新属性:

UPDATE store.books 
SET details->'author'->>'first_name' = '"Steve"' 
WHERE id = 4;

更新数组元素:

UPDATE store.books 
SET details->'editors'->>1 = '"Jack"' 
WHERE id = 4;

更新子文档:

UPDATE store.books 
SET details->'author' = '{"first_name":"John", "last_name":"Doe"}' 
WHERE id = 4;

添加新属性:

UPDATE store.books 
SET details->'language' = '"English"' 
WHERE id = 4;

JSONB Upsert操作

Upsert是"update or insert"的缩写,当记录不存在时会自动插入。

添加数组属性:

INSERT INTO store.books (id, details) VALUES (6, '{}');

UPDATE store.books 
SET details->'editors' = '["Adam", "Bryan", "Charles"]' 
WHERE id = 6;

添加子文档:

UPDATE store.books 
SET details->'author' = '{"first_name":"Jack", "last_name":"Kerouac"}' 
WHERE id = 6;

注意事项

  1. JSONB upsert仅适用于JSON对象,不适用于数组、整数、字符串等其他数据类型
  2. 仅当属性不存在时才会插入,不支持非叶子属性的upsert
  3. JSONB不保留空格、键顺序和重复键

最佳实践

  1. 对于需要频繁查询的JSON属性,考虑创建索引
  2. 避免在JSON中存储过大的文档
  3. 对于需要完整事务支持的场景,考虑将关键字段提取为独立列

通过JSONB数据类型,YugabyteDB YCQL为半结构化数据提供了强大的存储和查询能力,非常适合现代应用开发中的数据需求。

yugabyte-db yugabyte/yugabyte-db: 是 YugaByte DB 的官方仓库,一个高性能、高可扩展、分布式的 SQL 数据库,支持 PostgreSQL 兼容性。适合对分布式数据库、SQL 数据库和云原生应用的开发者。 yugabyte-db 项目地址: https://gitcode.com/gh_mirrors/yu/yugabyte-db

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋或依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值