객체 키 중 하나의 값을 기준으로 배열에서 객체를 제거하려면 어떻게해야합니까?
배열은 상위 개체 내에 중첩됩니다.
다음은 샘플 구조입니다.
{
"foo1": [ { "bar1": 123, "bar2": 456 }, { "bar1": 789, "bar2": 42 } ],
"foo2": [ "some other stuff" ]
}
의 값을 기반으로 배열 요소를 제거 할 수 있습니까 bar1
?
나는이에 따라 조회 할 수 있습니다 bar1
사용하여 값 : columnname @> '{ "foo1": [ { "bar1": 123 } ]}'
하지만 제거하는 방법을 찾는 운이 했어 { "bar1": 123, "bar2": 456 }
에서 foo1
다른 그대로 모든 것을 유지하면서.
감사
PostgreSQL 9.6 실행
특정 값의 내부 개체가있는 특정 개체를 검색하고이 특정 개체가 배열의 어느 위치 에나 나타날 수 있다고 가정하면 문서와 각 배열의 압축을 풀고 내부 하위 문서를 테스트해야합니다. 포함하고 적절하게 삭제 한 다음 배열과 JSON 문서를 다시 어셈블합니다 (테스트되지 않음).
SELECT id, jsonb_build_object(key, jarray)
FROM (
SELECT foo.id, foo.key, jsonb_build_array(bar.value) AS jarray
FROM ( SELECT id, key, value
FROM my_table, jsonb_each(jdoc) ) foo,
jsonb_array_elements(foo.value) AS bar (value)
WHERE NOT bar.value @> '{"bar1": 123}'::jsonb
GROUP BY 1, 2 ) x
GROUP BY 1;
이제 이것은 약간 조밀 해 보일 수 있으므로 분리하면 다음과 같은 결과를 얻을 수 있습니다.
SELECT id, key, value
FROM my_table, jsonb_each(jdoc)
이것은 테이블에서 측면 조인을 사용하여 JSON 문서를 가져와 배열 이 포함 된 jdoc
행 집합으로 변환합니다 . 은 테이블의 기본 키입니다.foo(id, key, value)
value
id
그런 다음 우리는 다음을 얻습니다.
SELECT foo.id, foo.key, jsonb_build_array(bar.value) AS jarray
FROM foo, -- abbreviated from above
jsonb_array_elements(foo.value) AS bar (value)
WHERE NOT bar.value @> '{"bar1": 123}'::jsonb
GROUP BY 1, 2
이것은 또 다른 측면 조인을 사용하여 배열을 bar(value)
행 으로 압축 해제합니다 . 이제 포함 연산자를 사용하여 이러한 개체를 검색하여 결과 집합에서 개체를 제거 할 수 있습니다 WHERE NOT bar.value @> '{"bar1": 123}'::jsonb
.. 선택 목록에서 배열은 재 조립에 의해입니다 id
및 key
하지만 지금은 기분을 상하게 하위 문서없이.
마지막으로 기본 쿼리에서 JSON 문서가 재 조립됩니다.
SELECT id, jsonb_build_object(key, jarray)
FROM x -- from above
GROUP BY 1;
이해해야 할 중요한 점은 PostgreSQL JSON 함수가 명시 적으로 표시 할 수있는 JSON 문서 수준에서만 작동한다는 것입니다. 문서의 특정 수준에 대한 명시 적 경로가없는 경우 일반적으로 문서의 최상위 수준입니다 {foo1, 0, bar1}
. 해당 수준의 작업에서 개체 제거와 같은 처리를 수행하기 위해 압축을 풀 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다