詳解如何在PostgreSQL中使用JSON數(shù)據(jù)類型
簡(jiǎn)介
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,它采用鍵值對(duì)的形式來(lái)表示數(shù)據(jù),支持多種數(shù)據(jù)類型。JSON被廣泛應(yīng)用于Web應(yīng)用程序中,用于數(shù)據(jù)的傳輸和存儲(chǔ)。
JSON支持的數(shù)據(jù)類型
1.對(duì)象(Object): 對(duì)象在JSON中是被花括號(hào){}包圍著的一系列鍵值對(duì)的集合,鍵與值之間使用冒號(hào):分隔,不同鍵值對(duì)之間使用逗號(hào),分隔。
{
"name": "John",
"age": 30,
"city": "New York"
}
2.數(shù)組(Array) :數(shù)組在JSON中是用方括號(hào)[]包圍著的一系列值的有序集合,值之間使用逗號(hào),分隔。
[ "apple", "banana", "cherry" ]
3.字符串(String) :字符串必須被雙引號(hào)""包圍。
"Hello, World!"
4.數(shù)值(Number) :JSON中的數(shù)值可以是整數(shù)或浮點(diǎn)數(shù),不需要引號(hào)包圍。
42 3.14159
5.布爾值(Boolean) :布爾值只有兩種,true 和 false,同樣不需要引號(hào)包圍。
true false
6.null:null在JSON中表示一個(gè)空值或者不存在的對(duì)象。
null
需要注意的是,JSON不支持JavaScript中的其他數(shù)據(jù)類型,比如函數(shù)或Date對(duì)象。如果需要在JSON中傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu),比如日期,通常需要將其轉(zhuǎn)換為字符串或數(shù)字,并在解析時(shí)將其轉(zhuǎn)回原始數(shù)據(jù)類型。
JSON的這種簡(jiǎn)潔、清晰的格式使得它成為前后端數(shù)據(jù)交換的常用方式,尤其是在Web服務(wù)(如RESTful API)中,JSON是首選的數(shù)據(jù)格式。
JSON的特點(diǎn)
1、簡(jiǎn)潔和易讀:JSON使用簡(jiǎn)潔的文本格式,易于閱讀和編寫;
3、可擴(kuò)展性:支持多種數(shù)據(jù)類型,可以靈活地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);
4、跨平臺(tái),JSON可以被多種編程語(yǔ)言支持和解析,可以在不同的平臺(tái)間進(jìn)行數(shù)據(jù)交換;
5、可嵌套性:值可以是一個(gè)對(duì)象,對(duì)象的值又可以是一個(gè)對(duì)象。
Postgres中json vs jsonb
Postgres支持存儲(chǔ)和查詢非結(jié)構(gòu)化數(shù)據(jù)。Postgres支持兩種存儲(chǔ)json數(shù)據(jù)的數(shù)據(jù)類型:json(以字符串形式存儲(chǔ))和jsonb(以二進(jìn)制形式存儲(chǔ))。盡管它們都用于存儲(chǔ) JSON 數(shù)據(jù),但它們之間存在一些重要的差異。
| 對(duì)比項(xiàng) | json類型 | jsonb類型 |
|---|---|---|
| 存儲(chǔ)格式 | 以純文本的形式存儲(chǔ)JSON數(shù)據(jù) | 二進(jìn)制格式存儲(chǔ) JSON 數(shù)據(jù) |
| 性能 | 插入數(shù)據(jù)速度更快對(duì)于復(fù)雜的查詢(如搜索、比較或修改 JSON 結(jié)構(gòu)中的數(shù)據(jù)),性能可能較差 | 在插入數(shù)據(jù)時(shí) jsonb 可能比 json 稍慢一些;jsonb 支持索引,進(jìn)行復(fù)雜查詢、修改性能更優(yōu)。 |
| 用途 | 簡(jiǎn)單地存儲(chǔ)JSON格式的數(shù)據(jù)、不需要頻繁修改JSON結(jié)構(gòu)或進(jìn)行復(fù)雜查詢的場(chǎng)景,比如日志記錄或某些不需要進(jìn)行復(fù)雜處理的配置數(shù)據(jù)。 | 當(dāng)你需要對(duì) JSON 數(shù)據(jù)進(jìn)行復(fù)雜查詢、修改或驗(yàn)證時(shí),jsonb 是更好的選擇。例如,你可以使用 jsonb 來(lái)存儲(chǔ)用戶數(shù)據(jù),并根據(jù)其中的特定字段進(jìn)行查詢或更新 |
使用教程
登錄MemFire Cloud平臺(tái),創(chuàng)建一個(gè)應(yīng)用,點(diǎn)擊進(jìn)入應(yīng)用詳情,找到SQL編輯器工具;
創(chuàng)建數(shù)據(jù)表
在這個(gè)例子中,id是一個(gè)自增的主鍵,title、author和published_date是常規(guī)的文本和日期字段,而metadata是一個(gè)jsonb字段,用于存儲(chǔ)書籍的元數(shù)據(jù)。
CREATE TABLE books (
id serial PRIMARY KEY,
title text NOT NULL,
author text NOT NULL,
published_date date NOT NULL,
metadata jsonb
);
注意,我們使用::jsonb來(lái)將字符串轉(zhuǎn)換為jsonb類型。
插入數(shù)據(jù)
你可以像插入任何其他數(shù)據(jù)一樣插入JSON數(shù)據(jù)。數(shù)據(jù)必須是有效的JSON。
INSERT INTO books (title, author, published_date, metadata)
VALUES (
'Effective PostgreSQL',
'Your Name Here',
'2023-01-01',
'{
"ISBN": "1234567890",
"publisher": "Your Publisher",
"pages": 300,
"language": "English"
}'::jsonb
);
執(zhí)行成功后,在編輯器可以查看結(jié)果:

查詢數(shù)據(jù)
查詢JSON數(shù)據(jù)與其他數(shù)據(jù)類似,有一些額外的特性可以訪問(wèn)嵌套值。Postgres支持一系列JSON函數(shù)和操作符。例如,->操作符將值作為jsonb數(shù)據(jù)返回。如果你想讓數(shù)據(jù)作為text返回,使用->>操作符。
SELECT * FROM books WHERE metadata->>'ISBN' = '1234567890';
執(zhí)行成功后,可以在SQL編輯器查看返回結(jié)果。

我們還可以使用更復(fù)雜的JSONB操作符和函數(shù)來(lái)執(zhí)行更復(fù)雜的查詢。例如,我們可以使用@>操作符來(lái)檢查JSONB對(duì)象是否包含特定的鍵值對(duì)
SELECT * FROM books WHERE metadata @> '{"ISBN": "1234567890"}';
索引
為了提高查詢性能,我們可以對(duì)jsonb字段創(chuàng)建GIN索引:
CREATE INDEX idxgin_metadata ON books USING gin(metadata);
這將大大提高涉及jsonb字段的查詢性能。
更新數(shù)據(jù)
使用jsonb_set函數(shù)可以更新jsonb字段中的特定值:
UPDATE books
SET metadata = jsonb_set(metadata, '{ISBN}', '"9876543210"')
WHERE id = 1;
執(zhí)行成功后,可以在SQL編輯器查看返回結(jié)果。

刪除數(shù)據(jù)
要從jsonb字段中刪除特定的鍵值對(duì),可以使用jsonb_strip_nulls與jsonb_set結(jié)合:
UPDATE books
SET metadata = jsonb_strip_nulls(jsonb_set(metadata, '{some_key}', 'null'))
WHERE id = 1;
這會(huì)將ID為1的書籍的some_key從metadata中刪除。
通過(guò)這些步驟,您可以在PostgreSQL中使用jsonb數(shù)據(jù)類型來(lái)存儲(chǔ)和管理書籍的元數(shù)據(jù)。
驗(yàn)證* JSON*數(shù)據(jù)
MemFire Cloud新發(fā)布版本中提供了根據(jù)JSON Schema文檔驗(yàn)證json和jsonb數(shù)據(jù)類型的能力。在數(shù)據(jù)庫(kù)->擴(kuò)展頁(yè)面,輸入框內(nèi)搜索json,找到擴(kuò)展pg_jsonschema,點(diǎn)擊啟用,如下圖所示。

現(xiàn)在,你可以向表中添加一個(gè)“檢查約束”,以驗(yàn)證JSON數(shù)據(jù):
create table customers (
id serial primary key,
metadata json
);
alter table customers
add constraint check_metadata check (
json_matches_schema(
'{
"type": "object",
"properties": {
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 16
}
}
}
}',
metadata
)
);
以上就是詳解如何在PostgreSQL中使用JSON數(shù)據(jù)類型的詳細(xì)內(nèi)容,更多關(guān)于PostgreSQL使用JSON數(shù)據(jù)類型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
查看PostgreSQL數(shù)據(jù)庫(kù)版本的方法小結(jié)
這篇文章主要給大家介紹了關(guān)于如何查看PostgreSQL數(shù)據(jù)庫(kù)的版本,查看PostgreSQL?數(shù)據(jù)庫(kù)的版本號(hào),可用方法很多,文中介紹了三種方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-12-12
PostgreSQL數(shù)據(jù)庫(kù)性能調(diào)優(yōu)的注意點(diǎn)以及pg數(shù)據(jù)庫(kù)性能優(yōu)化方式
這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫(kù)性能調(diào)優(yōu)的注意點(diǎn)以及pg數(shù)據(jù)庫(kù)性能優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
postgresql 刪除重復(fù)數(shù)據(jù)的幾種方法小結(jié)
這篇文章主要介紹了postgresql 刪除重復(fù)數(shù)據(jù)的幾種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
PostgreSQL數(shù)據(jù)庫(kù)事務(wù)插入刪除及更新操作示例
這篇文章主要為大家介紹了PostgreSQL事務(wù)的插入刪除及更新操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
postgresql 查看當(dāng)前用戶名的實(shí)現(xiàn)
這篇文章主要介紹了postgresql 查看當(dāng)前用戶名的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
PostgreSQL ROW_NUMBER() OVER()的用法說(shuō)明
這篇文章主要介紹了PostgreSQL ROW_NUMBER() OVER()的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
pgsql之pg_stat_replication的使用詳解
這篇文章主要介紹了pgsql之pg_stat_replication的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
pgsql 如何刪除仍有活動(dòng)鏈接的數(shù)據(jù)庫(kù)
這篇文章主要介紹了pgsql 刪除仍有活動(dòng)鏈接的數(shù)據(jù)庫(kù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
安全高效的PostgreSQL數(shù)據(jù)庫(kù)遷移解決方案
PostgreSQL數(shù)據(jù)庫(kù)是一款高度可擴(kuò)展的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng),支持復(fù)雜的查詢、事務(wù)完整性和多種數(shù)據(jù)類型由于各種業(yè)務(wù)需求,企業(yè)常常需要將數(shù)據(jù)在不同的云平臺(tái)或私有環(huán)境之間遷移,所以本文小編給大家介紹了安全高效的PostgreSQL數(shù)據(jù)庫(kù)遷移解決方案,需要的朋友可以參考下2023-11-11

