詳解如何在PostgreSQL中使用JSON數(shù)據(jù)類型
簡(jiǎn)介
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,它采用鍵值對(duì)的形式來表示數(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可以被多種編程語言支持和解析,可以在不同的平臺(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 來存儲(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
來將字符串轉(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對(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
中刪除。
通過這些步驟,您可以在PostgreSQL中使用jsonb
數(shù)據(jù)類型來存儲(chǔ)和管理書籍的元數(shù)據(jù)。
驗(yàn)證* JSON*數(shù)據(jù)
MemFire Cloud新發(fā)布版本中提供了根據(jù)JSON Schema文檔驗(yàn)證json
和jsonb
數(shù)據(jù)類型的能力。在數(shù)據(jù)庫->擴(kuò)展頁面,輸入框內(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ù)庫版本的方法小結(jié)
這篇文章主要給大家介紹了關(guān)于如何查看PostgreSQL數(shù)據(jù)庫的版本,查看PostgreSQL?數(shù)據(jù)庫的版本號(hào),可用方法很多,文中介紹了三種方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-12-12PostgreSQL數(shù)據(jù)庫性能調(diào)優(yōu)的注意點(diǎn)以及pg數(shù)據(jù)庫性能優(yōu)化方式
這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫性能調(diào)優(yōu)的注意點(diǎn)以及pg數(shù)據(jù)庫性能優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03postgresql 刪除重復(fù)數(shù)據(jù)的幾種方法小結(jié)
這篇文章主要介紹了postgresql 刪除重復(fù)數(shù)據(jù)的幾種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02PostgreSQL數(shù)據(jù)庫事務(wù)插入刪除及更新操作示例
這篇文章主要為大家介紹了PostgreSQL事務(wù)的插入刪除及更新操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04postgresql 查看當(dāng)前用戶名的實(shí)現(xiàn)
這篇文章主要介紹了postgresql 查看當(dāng)前用戶名的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01PostgreSQL ROW_NUMBER() OVER()的用法說明
這篇文章主要介紹了PostgreSQL ROW_NUMBER() OVER()的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02pgsql之pg_stat_replication的使用詳解
這篇文章主要介紹了pgsql之pg_stat_replication的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01pgsql 如何刪除仍有活動(dòng)鏈接的數(shù)據(jù)庫
這篇文章主要介紹了pgsql 刪除仍有活動(dòng)鏈接的數(shù)據(jù)庫操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01安全高效的PostgreSQL數(shù)據(jù)庫遷移解決方案
PostgreSQL數(shù)據(jù)庫是一款高度可擴(kuò)展的開源數(shù)據(jù)庫系統(tǒng),支持復(fù)雜的查詢、事務(wù)完整性和多種數(shù)據(jù)類型由于各種業(yè)務(wù)需求,企業(yè)常常需要將數(shù)據(jù)在不同的云平臺(tái)或私有環(huán)境之間遷移,所以本文小編給大家介紹了安全高效的PostgreSQL數(shù)據(jù)庫遷移解決方案,需要的朋友可以參考下2023-11-11