Postgres에서 JSON 개체에 요소 추가
데이터베이스(postgres 9.2.1)에 json blob이 포함된 텍스트 필드가 있습니다.모든 것이 한 줄에 있는 것을 제외하면 다음과 같이 보입니다.
{
"keyword": {
"checked": "1",
"label": "Keyword"
},
"agency_name": {
"checked": "0",
"label": "Agency Name"
}
}
다음과 같이 json 배열에 요소를 추가해야 합니다.
{
"keyword": {
"checked": "1",
"label": "Keyword"
},
"something_new": {
"checked": "1",
"label": "Something New"
},
"agency_name": {
"checked": "0",
"label": "Agency Name"
}
}
새로운 어레이 요소의 배치에는 그다지 관심이 없습니다.agency_name 뒤에 있을 수 있습니다.포스트그레스에서 쉽게 할 수 있는 방법이 있나요?
PG9.5.1로 업그레이드하는 경우 sql 연산자를 사용할 수 있습니다.||jsonb를 병합하는 예
select '{"a":1}'::jsonb || '{"a":2, "b":2}'::jsonb
돌아온다{"a": 2, "b": 2}
pg9.5.1, IMHO로 업그레이드할 수 없는 경우 코드로 작업을 수행하는 것이 좋습니다.오래된 jsonb 문자열을 맵으로 해석하고 맵을 갱신한 후 문자열로 변환하여 db-record를 갱신할 수 있습니다.
또한 JSONB 필드를 업데이트(추가)하는 경우:
UPDATE <table>
SET <field-name> = <field-name> || '{"a": 1}'::jsonb
WHERE id = <some id>
사용하다||jsonb를 병합하여 값을 설정합니다.
예:
원점:
식탁에 올라서a:
id | 정보
1 | {"aa":"bb"}
2 | {"aa":"cc"}
실행 후:
update a set info = info::jsonb || ('{"id":' || id || '}' )::jsonb
는 다음을 생성합니다.
id | 정보
1 | {"aa":"bb", id":1}
2 | {"aa":"cc", id":2}
something_something:
- 사용하다
-‘key’jsonb의 요소를 삭제하다 - 두 jsonb의 키가 동일한 경우 병합이 원본 하나를 대체합니다.
같은 문제가 있어도 jsonb[]에 새로운 요소를 동적으로 추가하고 싶었습니다.
column_jsonb[] = [{"name":xyz"", age":12"}]라고 가정합니다.
UPDATE table_name
SET column_jsonb[] = array_append(column_jsonb[],'{"name":"abc","age":"22"}');
결과: [{"name":xyz", "age":12", {"name":abc", "age":22"}]
PostgreSQL은 아직 JSON 지원 기능을 많이 가지고 있지 않습니다.제가 볼 수 있는 것은 다음과 같은 기능뿐입니다.array_to_json이것은 원래 JSON을 어레이로 변환하는 대응하는 방법이 있는 경우에 도움이 됩니다.이 방법을 조작하면, JSON으로 되돌리기 전에 그 요소를 추가할 수 있습니다.
가장 좋은 방법은 PL 언어를 사용하여 JSON을 조작하는 것입니다.Postgre에서 JavaScript 프로그래밍 기능을 제공하는 PLV8이 있습니다.SQL. 사용자 정의 함수를 JavaScript로 작성하여 JSON blob을 적절히 조작합니다.
물론 Java, Python 또는 Perl과 같은 다른 많은 PL 언어도 JSON 데이터 처리에 능숙할 수 있으며 시스템에 설치하기 쉬울 수 있습니다.사용자 정의 함수는 셋업되어 있는 경우 각각에 쓸 수 있습니다.
버전 9.5에서는 create_missing=TRUE를 가진 jsonb_set 함수를 제공합니다.그 이외의 경우에는 다음 해킹을 사용하여 정보를 추가합니다.
SELECT (trim( trailing '}' from data::text) || ', "c":2}')::json
보다 올바른 방법으로 새 값을 추가/바꾸려면:
UPDATE t
SET data=t3.data
FROM t AS t1
INNER JOIN
(
SELECT id, json_object_agg(t.k,t.v)
FROM
(
SELECT *
FROM (SELECT id, json_object_keys(data) as k, data->json_object_keys(data) as v FROM t) as t2
WHERE t.k != 'c'
UNION ALL
SELECT id, 'c'::text as k, '"new value"'::json as v FROM t1
) as t3
GROUP by id
) as t4 ON (t1.id=t4.id)
키를 삭제하려면:
UPDATE t
SET data=t3.data
FROM t AS t1
INNER JOIN
(
SELECT id, json_object_agg(t.k,t.v)
FROM (SELECT id, json_object_keys(data) as k, data->json_object_keys(data) as v FROM t) as t2
WHERE t.k != 'c'
GROUP by id
) as t4 ON (t1.id=t4.id)
정확히 이런 문제가 있었어요.이 솔루션은 상당히 '순수한' 객체 조작이므로 plpgsql보다는 'sql' 함수를 선호합니다.주요 사항은 json_each를 사용하여 세분화하고 레코드를 제공한 후
CREATE OR REPLACE FUNCTION json_extend_object(
input_object json,
append_key text,
append_object json)
RETURNS json AS
$BODY$
select json_object_agg (((json_val)::record).key, ((json_val)::record).value)
from (
select json_val
from (select json_each (input_object) as json_val) disaggr
where ((json_val::record).key != append_key)
union
select newvals
from (
select append_key, append_object
) newvals
) to_rows;
$BODY$
LANGUAGE sql IMMUTABLE
;
Andrew Wolfe가 제공하는 솔루션은 양호하지만 postgres 버전 < 9.4와 호환되지 않습니다.9.4+ 버전이 있는 경우 jsonb와 | (connectinate) 연산자를 사용하여 요소를 json에 추가합니다.
json_extend_object의 9.3 호환 버전을 다음에 나타냅니다.
CREATE OR REPLACE FUNCTION json_extend_object(
input_object json,
append_key text,
append_object json)
RETURNS json AS
$BODY$
select ('{'||string_agg(''||to_json((json_val::record).key)||':'|| to_json((json_val::record).value), ',')||'}')::json
from (
select json_val
from (select json_each (input_object) as json_val) jsonvals
where ((json_val::record).key != append_key)
union
select newvals
from (select append_key, append_object) newvals
) to_rows;
$BODY$
LANGUAGE sql IMMUTABLE;
언급URL : https://stackoverflow.com/questions/13615760/add-element-to-json-object-in-postgres
'programing' 카테고리의 다른 글
| Spring 앱의 옵션 환경 변수 (0) | 2023.04.04 |
|---|---|
| 값이 null이 아닌 Mongoose 쿼리 (0) | 2023.04.04 |
| 언로드 이벤트를 사용하여 Ajax 요청을 확실하게 실행할 수 있습니까? (0) | 2023.03.25 |
| Wordpress에 대한 테마 주석 헤더를 남기면서 Sas 압축 출력을 사용합니다. (0) | 2023.03.25 |
| Angular가 있는 개체 배열에서 해당 속성으로 개체 찾기JS 방식 (0) | 2023.03.25 |