繁體中文(香港)
  • postgresql
  • jsonb
  • json
  • database

掌握 PostgreSQL JSONB 類型的一篇文章

了解如何使用 PostgreSQL 的 JSONB 類型來高效存儲、查詢和操作 JSON 數據。

Yijun
Yijun
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

在現代應用開發中,處理和存儲非結構化數據變得越來越普遍。PostgreSQL 的 JSONB 類型為開發者提供了一個強大的工具,以高效地存儲和查詢 JSON 數據。在本文中,我們將深入探討 JSONB 類型的概念和用法,並通過具體的代碼示例展示其強大的功能。

什麼是 JSONB?

JSONB 是 PostgreSQL 中用於以二進制格式存儲 JSON 數據的數據類型。與普通的 JSON 類型不同,JSONB 在查詢和操作上更高效。它支持一套豐富的運算符和函數,簡化了 JSON 數據的處理。此外,JSONB 還支持多種索引類型,包括 B-tree、Hash、GIN 和 GiST 索引,進一步提升查詢性能。

創建 JSONB 類型

創建帶有 JSONB 類型的表

首先,讓我們創建一個具有 JSONB 列的表。假設我們有一個 products 表來存儲產品信息,產品詳情使用 JSONB 類型存儲。

插入 JSONB 數據

我們可以使用簡單的 INSERT 語句將 JSON 數據插入 JSONB 字段中。

查詢 JSONB 數據

從 JSONB 字段提取值

我們可以使用 ->> 運算符從 JSONB 字段中提取文本值。以下示例展示了如何提取產品的品牌信息。

使用 JSONB 提取嵌套值

我們可以使用 ->->> 運算符的組合來提取嵌套在 JSON 結構中的值。以下示例展示了如何提取產品的 CPU 信息。

使用 JSONB 路徑提取值

使用 #>> 運算符,我們可以從 JSON 數據中的特定路徑提取值。以下示例展示了如何提取存儲信息。

使用 @> 運算符進行包含查詢

@> 運算符檢查 JSONB 對象是否包含另一個 JSONB 對象。以下示例展示了如何查詢特定品牌的產品。

修改 JSONB 數據

更新 JSONB 數據

我們可以使用 jsonb_set 函數更新 JSONB 數據。這個函數會在指定路徑上更新值。以下示例展示了如何更新產品的存儲信息。

刪除 JSONB 數據中的頂層字段

我們可以使用 - 運算符從 JSONB 數據中刪除頂層字段。這個運算符會從 JSONB 對象中刪除指定的鍵。以下示例展示了如何從產品詳情中刪除頂層字段。

刪除 JSONB 數據中的嵌套字段

我們可以使用 #- 運算符從 JSONB 數據中刪除特定路徑元素。這個運算符會刪除指定路徑上的鍵。以下示例展示了如何從產品規格中刪除 CPU 信息。

高級 JSONB 查詢

使用 JSONB 數組

JSONB 數據可以包含數組,我們可以使用與數組相關的運算符來處理這些數據。以下示例展示了如何存儲和查詢具有多個標籤的產品。

在上面的示例中,你還可以使用 ? 運算符來檢查 JSONB 數組中是否包含特定元素:

合併 JSONB 數據

我們可以使用 || 運算符來合併兩個 JSONB 對象。這個運算符將兩個 JSONB 對象合併為一個。以下示例展示了如何將新規格合併到現有產品詳情中。

聚合 JSONB 數據

我們可以使用聚合函數來處理 JSONB 數據,例如計算每一個品牌的產品數量。

JSONB 索引和性能優化

為了提高 JSONB 數據的查詢性能,我們可以在 JSONB 字段內的特定鍵上創建索引。選擇正確的索引類型對於不同的查詢需求至關重要。

  • GIN 索引:適用於涉及多值數據、數組和全文搜索的複雜查詢。
  • B-tree 索引:適用於簡單的鍵值對查詢、範圍查詢和排序操作。

正確選擇和創建索引可以顯著提升 JSONB 數據查詢的性能。

創建 GIN 索引

GIN 索引適合加速涉及多值數據和數組的查詢。例如,我們可以為前面提到的 tags 數組創建 GIN 索引以加速數組元素上的查詢。

創建 B-tree 索引

對於簡單的鍵值對查詢,B-tree 索引也可以顯著提高性能。B-tree 索引適用於範圍查詢和排序操作。以下示例展示了如何為 details 字段中的 model 鍵創建 B-tree 索引。

結論

PostgreSQL 的 JSONB 類型為處理 JSON 數據提供了一個強大且靈活的解決方案。通過本文的介紹和示例,你現在應該對如何使用 JSONB 類型有了全面的理解。掌握這些技術後,你可以高效地處理和查詢非結構化數據,從而提升你的應用性能和靈活性。