1. ホーム
  2. データベース
  3. ポストグレスキュー

postgresのjsonbプロパティの利用について

2022-01-10 12:22:45

jsonbの簡単な操作(追加、削除、変更)

1, 更新操作 (attributes 属性は jsonb 型)

メソッドの定義です。

jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])

パラメータです。

target : 対象(jsonb 型の属性)

path path : パス、jsonbが配列の場合 '{0, a}' は添え字が0の位置のaプロパティを更新することを意味し、配列でなくオブジェクトの場合は '{a}' と記述します。

new_value : 新しい値

オプションのパラメータ: create_missing: jsonbフィールドにf1属性がない場合に作成、デフォルトはtrue

戻り値:更新されたjsonb

公式ドキュメントでは、以下のような例(jsonb配列)が示されています。

jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}', '[2,3,4]', false)
Result: [{"f1":[2,3,4],"f2":null},2,null,3]
jsonb_set('[{"f1":1,"f2":null},2]', '{0,f3}', '[2,3,4]')
Result: [{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2]


jsonb属性を更新します。

-- attributes are jsonb type fields (objects converted to json)
original value: {"a":"1"}
update user_test set attributes = jsonb_set(attributes,'{a}','"0"'::jsonb, false) where id = '8888';
After execution: {"a":"0"}

jsonbの属性を挿入します。

-- After execution the attributes field adds platform: baidu
update user_test set attributes = attributes::jsonb || '{"platform":"baidu"}'::jsonb;
Alternatively.
update user_test set attributes = jsonb_set(attributes, '{platform}','"baidu"');

クエリ

select value from json_each('{"a":"foo", "b":"bar"}') where key = 'a'
select * from json_object_keys('{"a":"foo", "b":"bar"}')
select * from json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b& quot;}}')
select * from json_object_keys(from ci_type.attributes);--error
select * from to_jsonb('"a":1,"b":2') 
 select '{"a":1,"b":2}'::json->>'b' --get the value of the corresponding key in jsonb (text)
 --select * from json_each( to_jsonb(select distinct attributes from ci_type ) )
 --select to_jsonb(select distinct attributes from ci_type ) 
 
--extend the field to extract the value of the corresponding attribute
  select attributes :: json->>'instanceType' from ci_type 
-- attributes values to jsonb
select to_jsonb('id:'||id::text) from ci
--jsonb add attribute, delete attribute
select '{"a":"foo", "b":"bar"}'::jsonb || '{"c":"fc", "d":" bdd"}'::jsonb - add
select '{"a":"foo", "b":"bar"}'::jsonb -'c'-'d'-'a'|||'{"a":2}' - delete
select '{"a": "b","c":3}'::jsonb - 'a'
-- Get json object by path: #>
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #> '{ b,ba}'
Result: "b1"
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #> '{ b}'
Result: {"ba":"b1","bb":"b2"}
-- Get json object as text based on path: #>>
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #>& gt; '{b,ba}'
Result: "b1"


を追加しましょう。

1. to_jsonb()メソッドは1つの引数を受け取り、その引数をjsonbに変換します。

jsonb stores the millisecond value field
# Update the create_time field in the attributes field in the user table to the current time
update user_test
set attributes = jsonb_set(attributes,'{create_time}',to_jsonb(extract(epoch from now())*1000), true)

2. extract(epoch from now())*1000 ミリ秒の値を取得する。

EXTRACT(field FROM source)

フィールドは取得する時間オブジェクトを、ソースは取得する日付ソースを示し、タイプはtimestamp、time、またはintervalである。

EXAMPLE:select extract(year from now());

extract(epoch from now()) 1970-01-01 00:00:00 UTC までの秒数を確認します。

epoch :Epochはターゲットタイムと1970-01-01 00:00:00 UTCの間の秒数で、ターゲットタイムと1970-01-01 00:00:00 UTCの間の秒数差です。

Postgresql が jsonb 配列を操作する

まず、テーブルの構造を見てみましょう。

create table person 
(id int, -- unique identifier
label jsonb); -- array of labels for the person (specifying which company the person is from), one object at a time

ラベルフィールドデータの例

[{"id":1,"code":"p123","name":"ali"},{"id":2,"code":" p123","name":"ali"}]

要件:タグの追加、タグの削除、タグのクリアを実装するSQLを作成する。

1. タグの追加

2つのjsonbを||記号で直接1つのjsonbに結合します。

-- when label is null
update person set label = '{"id":1,"code":"p123","name":"ali"}'::jsonb;

-- run when label is not null
update person set label = '{"id":1,"code":"p123","name":"ali"}'::jsonb || label

注意:ラベルがNULLの場合、結果もNULLになります

2. ラベルをクリアする

これは比較的簡単で、nullに設定するだけです。

update person set label = null;

3. ラベルの削除

これは少しトリッキーなことで、私は

-> ->> jsonb_array_elements() jsonb_build_array() array()

これらの記号や関数の使い方に馴染みのない方は、こちらをご覧ください。 http://www.postgres.cn/docs/10/datatype-json.html

update person 
set label = jsonb_build_array(
    array( -- Without this function, an error will be reported when filtering out more than 2 hops of data, because the jsonb_build_array function can only have one json
        (select * from 
         (select jsonb_array_elements(label)j from person where id = 1) as a 
         where (j->>'id')::int <> 1) -- filter out the objects to be deleted
    )
)->0 -- if you don't add this you get two arrays of [[]]s
where id = 1;

以上、pg で jsonb 配列を操作するための私の解決策を紹介しましたが、参考になれば幸いです。