詳解如何在PostgreSQL中使用JSON數(shù)據(jù)類型
簡介
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式,它采用鍵值對的形式來表示數(shù)據(jù),支持多種數(shù)據(jù)類型。JSON被廣泛應(yīng)用于Web應(yīng)用程序中,用于數(shù)據(jù)的傳輸和存儲。
JSON支持的數(shù)據(jù)類型
1.對象(Object): 對象在JSON中是被花括號{}
包圍著的一系列鍵值對的集合,鍵與值之間使用冒號:
分隔,不同鍵值對之間使用逗號,
分隔。
{ "name": "John", "age": 30, "city": "New York" }
2.數(shù)組(Array) :數(shù)組在JSON中是用方括號[]
包圍著的一系列值的有序集合,值之間使用逗號,
分隔。
[ "apple", "banana", "cherry" ]
3.字符串(String) :字符串必須被雙引號""
包圍。
"Hello, World!"
4.數(shù)值(Number) :JSON中的數(shù)值可以是整數(shù)或浮點數(shù),不需要引號包圍。
42 3.14159
5.布爾值(Boolean) :布爾值只有兩種,true
和 false
,同樣不需要引號包圍。
true false
6.null:null在JSON中表示一個空值或者不存在的對象。
null
需要注意的是,JSON不支持JavaScript中的其他數(shù)據(jù)類型,比如函數(shù)或Date對象。如果需要在JSON中傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu),比如日期,通常需要將其轉(zhuǎn)換為字符串或數(shù)字,并在解析時將其轉(zhuǎn)回原始數(shù)據(jù)類型。
JSON的這種簡潔、清晰的格式使得它成為前后端數(shù)據(jù)交換的常用方式,尤其是在Web服務(wù)(如RESTful API)中,JSON是首選的數(shù)據(jù)格式。
JSON的特點
1、簡潔和易讀:JSON使用簡潔的文本格式,易于閱讀和編寫;
3、可擴展性:支持多種數(shù)據(jù)類型,可以靈活地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);
4、跨平臺,JSON可以被多種編程語言支持和解析,可以在不同的平臺間進行數(shù)據(jù)交換;
5、可嵌套性:值可以是一個對象,對象的值又可以是一個對象。
Postgres中json vs jsonb
Postgres支持存儲和查詢非結(jié)構(gòu)化數(shù)據(jù)。Postgres支持兩種存儲json
數(shù)據(jù)的數(shù)據(jù)類型:json
(以字符串形式存儲)和jsonb
(以二進制形式存儲)。盡管它們都用于存儲 JSON 數(shù)據(jù),但它們之間存在一些重要的差異。
對比項 | json類型 | jsonb類型 |
---|---|---|
存儲格式 | 以純文本的形式存儲JSON數(shù)據(jù) | 二進制格式存儲 JSON 數(shù)據(jù) |
性能 | 插入數(shù)據(jù)速度更快對于復(fù)雜的查詢(如搜索、比較或修改 JSON 結(jié)構(gòu)中的數(shù)據(jù)),性能可能較差 | 在插入數(shù)據(jù)時 jsonb 可能比 json 稍慢一些;jsonb 支持索引,進行復(fù)雜查詢、修改性能更優(yōu)。 |
用途 | 簡單地存儲JSON格式的數(shù)據(jù)、不需要頻繁修改JSON結(jié)構(gòu)或進行復(fù)雜查詢的場景,比如日志記錄或某些不需要進行復(fù)雜處理的配置數(shù)據(jù)。 | 當你需要對 JSON 數(shù)據(jù)進行復(fù)雜查詢、修改或驗證時,jsonb 是更好的選擇。例如,你可以使用 jsonb 來存儲用戶數(shù)據(jù),并根據(jù)其中的特定字段進行查詢或更新 |
使用教程
登錄MemFire Cloud平臺,創(chuàng)建一個應(yīng)用,點擊進入應(yīng)用詳情,找到SQL編輯器工具;
創(chuàng)建數(shù)據(jù)表
在這個例子中,id
是一個自增的主鍵,title
、author
和published_date
是常規(guī)的文本和日期字段,而metadata
是一個jsonb字段,用于存儲書籍的元數(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
來將字符串轉(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ù)類似,有一些額外的特性可以訪問嵌套值。Postgres支持一系列JSON函數(shù)和操作符。例如,->
操作符將值作為jsonb
數(shù)據(jù)返回。如果你想讓數(shù)據(jù)作為text
返回,使用->>
操作符。
SELECT * FROM books WHERE metadata->>'ISBN' = '1234567890';
執(zhí)行成功后,可以在SQL編輯器查看返回結(jié)果。
我們還可以使用更復(fù)雜的JSONB操作符和函數(shù)來執(zhí)行更復(fù)雜的查詢。例如,我們可以使用@>
操作符來檢查JSONB對象是否包含特定的鍵值對
SELECT * FROM books WHERE metadata @> '{"ISBN": "1234567890"}';
索引
為了提高查詢性能,我們可以對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
字段中刪除特定的鍵值對,可以使用jsonb_strip_nulls
與jsonb_set
結(jié)合:
UPDATE books SET metadata = jsonb_strip_nulls(jsonb_set(metadata, '{some_key}', 'null')) WHERE id = 1;
這會將ID為1的書籍的some_key
從metadata
中刪除。
通過這些步驟,您可以在PostgreSQL中使用jsonb
數(shù)據(jù)類型來存儲和管理書籍的元數(shù)據(jù)。
驗證* JSON*數(shù)據(jù)
MemFire Cloud新發(fā)布版本中提供了根據(jù)JSON Schema文檔驗證json
和jsonb
數(shù)據(jù)類型的能力。在數(shù)據(jù)庫->擴展頁面,輸入框內(nèi)搜索json,找到擴展pg_jsonschema
,點擊啟用,如下圖所示。
現(xià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ù)類型的詳細內(nèi)容,更多關(guān)于PostgreSQL使用JSON數(shù)據(jù)類型的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
查看PostgreSQL數(shù)據(jù)庫版本的方法小結(jié)
這篇文章主要給大家介紹了關(guān)于如何查看PostgreSQL數(shù)據(jù)庫的版本,查看PostgreSQL?數(shù)據(jù)庫的版本號,可用方法很多,文中介紹了三種方法,對大家的學(xué)習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-12-12PostgreSQL數(shù)據(jù)庫性能調(diào)優(yōu)的注意點以及pg數(shù)據(jù)庫性能優(yōu)化方式
這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫性能調(diào)優(yōu)的注意點以及pg數(shù)據(jù)庫性能優(yōu)化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03postgresql 刪除重復(fù)數(shù)據(jù)的幾種方法小結(jié)
這篇文章主要介紹了postgresql 刪除重復(fù)數(shù)據(jù)的幾種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02PostgreSQL數(shù)據(jù)庫事務(wù)插入刪除及更新操作示例
這篇文章主要為大家介紹了PostgreSQL事務(wù)的插入刪除及更新操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04PostgreSQL ROW_NUMBER() OVER()的用法說明
這篇文章主要介紹了PostgreSQL ROW_NUMBER() OVER()的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02pgsql之pg_stat_replication的使用詳解
這篇文章主要介紹了pgsql之pg_stat_replication的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01安全高效的PostgreSQL數(shù)據(jù)庫遷移解決方案
PostgreSQL數(shù)據(jù)庫是一款高度可擴展的開源數(shù)據(jù)庫系統(tǒng),支持復(fù)雜的查詢、事務(wù)完整性和多種數(shù)據(jù)類型由于各種業(yè)務(wù)需求,企業(yè)常常需要將數(shù)據(jù)在不同的云平臺或私有環(huán)境之間遷移,所以本文小編給大家介紹了安全高效的PostgreSQL數(shù)據(jù)庫遷移解決方案,需要的朋友可以參考下2023-11-11