Postgresql json 관련 operator
여기서는 모든 operator 를 다루지는 않는다.모든 operator 에 대한 이야기는 ref. 1을 확인하자.
이 글 예제에서는 다음 값을 가진 table 에 대한 query 이다.
my_table
-----------------------------------------------------------------------------------+ | name | data | -----------------------------------------------------------------------------------+ | 'test' | '{"datakey":{"10001":{"mine":"full", "tags":["a", "b"]}, | | | "10002":{"mine":"full2", "tags":["a", "c"]}}} ...' |
jsonb_each / json_each
key / value 항목들을 전부 record 로 만들어 준다. 아래 예시를 보자.my_table 의 datakey 의 내용을 key/value 의 record 로 보여줘
SELECT json_data.key, json_data.value FROM my_table AS t, jsonb_each(t.data->'datakey') AS json_data
| key(text) | value(jsonb) | +------------------------------+ | 100001 | {"mine":"full"} | | 100002 | {"mine":"full2"} |
->
nested key 를 traverse 할때는 아래 처럼 하면 된다.my_table 에서 root > datakey > 10001 의 값을 줘라
SELECT data->'datakey'->'10001' my_table AS a
#>
원하는 key 에 대한 값을 가져올 수 있다.{datakey, 10001} 순서의 key(datakey의 child 로 10001 이라는 key) 에 해당하는 값을 가져올때
>> SELECT a.data #> '{datakey, 10001}' FROM my_table AS a {"mine":"full"}
@>
특정 모양의 값을 가지고 있는지 여부, A@>B 라면, A 가 B 의 모양을 갖고 있는가.
data 의 json 이 {"datakey" : {"10001" : {...}}} 의 모양을 갖는 object 를 가진 모든 record 를 가져와라.
SELECT * FROM my_table AS a WHERE a.data @> '{"datakey": {"10001" : {}}}'
Materialized View
기본적으로 depth 가 많은 json (nested json)은 query 를 만들기에 좋지 않아 보인다. 대략 depth 1 정도의 view 로 만들어서 원하는 query 를 만드는 것이 좋아보인다. (보충 자료 : see also. 1)
CREATE MATERIALIZED VIEW mview_table_lastest AS SELECT json_data.key::int AS id, json_data.value AS data FROM my_table AS t, jsonb_each(t.data->'datakey') AS json_data -- index CREATE INDEX ON mview_table_lastest(key);
tags 'a' 를 가진 모든 data 를 보여줘라.
SELECT t.id, t.data FROM public.mview_table_lastest as t WHERE t.data->'tags' ?| Array['a']::text[]
See Also
- Converting JSON to PostgreSQL values, simply | End Point Blog : nested json 을 사용하기 편하게 하기 위해 Create View 를 한다.
References
- PostgreSQL: Documentation: 9.6: JSON Functions and Operators
- PostgreSQL: Documentation: 9.6: JSON Types
- Querying JSON in Postgres - Schinckel.net
댓글 없음:
댓글 쓰기