跳转到主要内容
模块 15 · 第 1 课(共 2)课程中的56/57~15 min
模块课程(1/2)

JSON 和 JSONB 集成

JSON 和 JSONB 集成

PostgreSQL 通过将 SQL 令人放心、坚如磐石的 ACID 特性与 NoSQL 典型的动态、流畅灵活性相结合,重写了数据库规则。它通过提供本机专用于存储 JSON 数据的列来实现这一点。

注意:在 Postgres 中,几乎总是建议使用 JSONB。 “B”代表二进制:存储在这些列中的 JSON 文档失去了纯文本格式,但它们获得了验证、高性能查询、操作甚至使用经典 B 树或 GIN INDEX 进行索引的能力。

导航 JSON:“箭头”运算符

不幸的是 ecommerce 数据库当前没有预定义的纯 JSON 列。但是,我们可以创建临时 JSON 值并从文本“转换”它们!

使用 JSON 时,钻取对象和数组的运算符是 -> (将数据保留为纯 jsonb/json 形式)或其“扩展”版本 ->> (将遇到的 JSON 数据转换为文本)。

学术示例,就好像存在“元数据”JSON 列:

SQL
-- Look up the value associated with the info key
SELECT metadata->'info' FROM users;

-- Drill into info, and grab city as text
SELECT metadata->'info'->>'city' FROM users;
锻炼#sql.m15.l1.e1
尝试:0加载中...

让我们即时查询 JSON。投影此 json 文字 \`'{"user": {"name": "Mario"}}'::json\` 并使用 \`->\` 运算符与文本版本 (\`->>\`) 结合来提取 'name',将提取的列命名为 'user_name'。

正在加载编辑器...
显示提示

转换为 ::json 或 ::jsonb,并使用 ->'user'->>'name'。

3 次尝试后可用的解决方案

锻炼#sql.m15.l1.e2
尝试:0加载中...

如果我们传递一个数组怎么办? Postgres 中 json_b 中的数组访问通过 INDEX(从零开始)进行。从 \`'["A", "B", "C"]'::json\` 中将第二个元素提取为文本,并将其命名为“letter”。

正在加载编辑器...
显示提示

->>1(它是从零开始的!)

3 次尝试后可用的解决方案