使用PostgreSQL处理JSONB
在查找JSONB概述和功能时的临时备忘录。
JSONB 是一种基于JSON的二进制数据类型。
根据文件显示
有两种JSON数据类型:json和jsonb。它们几乎接受相同的输入值。主要实际区别在于效率。json数据类型存储输入文本的精确副本,在每次执行时处理函数必须重新解析;而jsonb数据以分解的二进制格式存储。
JSON似乎有一個以文本形式保存的版本,也有一個保存為decomposed binary format的版本(未查明decomposed binary format的細節)。
在PostgreSQL中,使用JSONB数据类型可以实现更快的操作。该数据类型与JSON相比具有以下优缺点。
好处
-
- より効率的
-
- 処理の高速化
-
- インデックスのサポート
- よりシンプルなスキーマデザイン
缺点
-
- 少し入力(Insert?)が遅い
-
- テーブルのフットプリントが大きく、よりdisk spaceが必要
- 特定のクエリ(特にaggregation)が遅い
创建桌子
# CREATE TABLE test (dummy_id serial NOT NULL, data jsonb);
请填入。
# INSERT INTO test VALUES (1, '{"some_key":"some_value"}');
INSERT 0 1
选择
JSON操作符
9月15日。JSON函数和操作符。
选择(关键要素)
# INSERT INTO test VALUES (1, '{"some_key":"some_value"}');
INSERT 0 1
# SELECT data->'some_key' AS some_key FROM test;
some_key
--------------
"some_value"
(1 row)
选择(数组元素)
# INSERT INTO test VALUES (1, '["a","b","c","d","e"]');
INSERT 0 1
# SELECT data->1 FROM test;
?column?
----------
"b"
(1 row)
查询(查找包含特定值的记录)
# INSERT INTO test VALUES (1, '["a","b","c"]');
INSERT 0 1
# SELECT * FROM test WHERE data ? 'a';
dummy_id | data
----------+-----------------
1 | ["a", "b", "c"]
(1 row)
查询(包含特定值的所有/任意记录)
# INSERT INTO test VALUES (1, '["a","b","c"]');
INSERT 0 1
# SELECT * FROM test WHERE data ?| array['a', 'b'];
dummy_id | data
----------+-----------------
1 | ["a", "b", "c"]
(1 row)
# SELECT * FROM test WHERE data ?& array['a', 'b'];
dummy_id | data
----------+-----------------
1 | ["a", "b", "c"]
(1 row)
创建索引
The default GIN operator class for jsonb supports queries with the @>, ?, ?& and ?| operators.
-
- 特定のJSONを含んでいるか/含まれているか
-
- 特定の値がキーまたは要素に含まれているか
- キーまたは要素を含んでいるか
# CREATE INDEX idx_some_key ON test USING gin ((data->'some_key'));
CREATE INDEX
有两个选项,json_ops和json_path_ops,其中默认为json_ops。
从数组中特定的元素开始搜索。
select dataset_item_id, attributes from dataset_items, jsonb_array_elements(dataset_items.attributes->'classification') element WHERE element->>'label' = 'cat';