使用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';
广告
将在 10 秒后关闭
bannerAds