如何用JSONB更快地查询PostgreSQL中的JSON数据

2,044 阅读3分钟

Query JSON data in postgreSQL faster with JSONB

在我作为产品经理的日常工作中,我经常要做一些数据探索以更好地了解我们的客户。

在我们的数据中,存储在一个postgreSQL数据库中,有许多字段被格式化为JSON,我经常要通过这些字段来划分我们的用户。

为此,我使用了JSONB,我想与你分享我在postgres中查询JSON时使用的小技巧和捷径。但首先,什么是JSONB?

什么是JSONB?

JSONB是一种用于存储JSON的结构化格式。JSONB不是以纯文本形式存储数据,而是以二进制格式存储数据。

JSON和JSONB都将允许你存储有效的JSON值。JSON和JSONB的主要区别将是写入和读取效率。由于JSON以全文形式存储数据,编写不需要开销,因此比JSONB稍快,因为JSONB需要将文本转换成二进制。然而,处理JSONB要比处理JSON快得多,因为它不需要重新解析数据。

你可以在PostgreSQL文档中了解更多

在postgreSQL中查询JSONB

由于我们的PostgreSQL数据库涉及到对JSON数据的大量处理,我们将其存储为JSONB。因此我需要使用JSONB来处理这些JSON数据。那么,这是怎么做的呢?嗯,就像JSON一样,因为JSONB的优点是你可以像操作JSON一样操作它。

让我们考虑一下你的表mytable 中的一个字段myfield. (多么有创意!)

这个字段是一个JSON字段,其值为 。

{
"key1":"valueA",
"key2":"valueB"
} 

我想只选择存在 "key1 "并且等于 "valueA "的行。

这通常是用于基于一个值的分段。

选项1:使用@>操作数

SELECT *
FROM mytable
WHERE myfield @> '{"key1":"valueA"}'

选项2:使用->> 操作数

SELECT *
FROM mytable
WHERE myfield->>'key1'='valueA'

->> 操作数将以文本形式返回键key1 的值。你可以使用操作数-> 来返回一个数组。

当访问JSON字段中的值时,以下是我常用的操作数。

操作数

右边操作数类型

说明

->

文本

以数组形式返回与右操作数相关的值。

->>

文本

将与右操作数相关的值作为文本返回。

#>

数组

以数组形式返回特定JSON路径下的值。

#>>

数组

在一个特定的JSON路径下,将值作为文本返回。

@>

JSON字段

左边的JSON是否包含右边的JSON?

<@

JSON字段

右边的JSON包含左边的JSON吗?

我想只选择存在顶层'key3'的行。

操作数?用于检查顶层键的存在。

SELECT *
FROM mytable
WHERE myfield?'key3'

当检查一个JSON字段的存在性和包含性时,以下是我常用的操作数。

操作数

右边操作数类型

说明

?

文本

这个键是我的JSON字段中的顶级键吗?

?|

文本数组

这些键中的任何一个是我的JSON字段中的顶级键吗?

?&

文本数组

所有这些键都是我的JSON字段中的顶级键吗?

我想看看key1能有的所有值。

SELECT DISTINCT myfield->'key1'

或者,如果你想让它们变成文本

SELECT DISTINCT myfield->>'key1'

今天就到这里吧

你可以在PostgreSQL官方文档中找到更多信息。

想了解更多的PostgreSQL技巧吗?请看我们的Postgres骗局表

需要为PostgreSQL建立管理面板或GUI工具吗? 查看PostgreSQL的森林管理