Skip to content

PostgreSQL JSON Path Language #

Find similar titles
  • 최초 작성자
    ihcho

Structured data

Category
Programming

JSON Path Language #

JSON 데이터는 "키:값"의 구조로 "값"에는 또 다른 JSON 객체를 가질 수 있으므로 아래와 같이 계층화되어 있다. PostgreSQL/JSON Functions and Operators에서 살펴본 Functions and Operators를 이용하여 원하는 데이터에 접근할 수는 있지만, 더 세분된 JSON 데이터라면 더 많은 Functions and Operators를 사용해야 한다. 오늘 살펴볼 JSON Path Language는 JSON 데이터의 계층을 경로 표현 식으로 간편하게 질의하여 원하는 데이터를 처리할 수 있다.

{
    "height": [
        {
            "d": "2019-01-02",
            "h": 176
        },
        {
            "d": "2020-01-04",
            "h": 178
        },
        {
            "d": "2020-11-30",
            "h": 180
        }
    ]
}

경로 표현식은 최상위 객체를 의미하는 $ 기호로 시작한다. 그 뒤에는 하위 객체의 키를 사용하여 경로를 만들 수 있다. 예를 들어 위 JSON 구조에서 신장에 대한 데이터에 접근하기 위해 아래와 같이 경로를 만들 수 있다.

'$.height'
#reuslt : [
    {"d": "2019-01-02","h": 176},
    …
]

하위 객체가 배열일 경우는 아래와 같이 경로를 설정하면 된다. 신장 데이터 안의 모든 측정일 데이터를 얻을 수 있다. [] 접근 연산자에 숫자를 삽입하면 해당 인덱스의 측정일 데이터만 조회할 수도 있다.

첫번째 : '$.height[*].d'
#reuslt : [
    {"d": "2019-01-02"}, {"d": "2020-01-04"}, {"d": "2020-11-30"}
]

두번째 : '$.height[0].d'
#reuslt : [
    {"d": "2019-01-02"}
]

위 예제에서 height 객체는 배열 값을 가지기 때문에 height의 신장 측정 횟수를 구하고 싶을 때는 size() 메서드를 활용한다.

'$.height.size()' 
#reuslt : 3

여기까지는 JSON Function 중에서 text[]을 통하여 질의하는 방법과 별다른 차이가 없어 보인다. 경로 표현식의 가장 큰 장점은 SQL 질의문 WHERE와 유사하게 조건절을 사용하여 구체적인 질의를 할 수 있다는 점이다. 경로 표현식의 조건절은 '?' 기호로 시작하며 그 뒤에 조건을 기술한다. 아래는 2020년 이후 신장측정일을 조회할 수 있는 경로 표현식이다.

'$.height[*].d ? (@ >= "2020-01-01")' 
#reuslt : [
    {"d": "2020-01-04"}, {"d": "2020-11-30"}
]

조건절에서 경로는 @ 변수를 사용하여 표시한다. 위 예제에서 @$.height[*].d를 의미한다. 그렇다면 신장측정일이 2020년 이후인 신장측정 값은 어떻게 접근할 수 있을까? @가 경로 표현식을 의미한다고 했으니 경로 표현식을 한 단계 상위 경로로 표현한 다음 아래와 같이 @의 뒤에 킷값을 기술하면 된다. 조건절은 경로 표현식의 결과 객체이기 때문에 조건절 뒤에 원하는 킷값을 기술한다.

'$.height[*] ? (@.d >= "2020-01-01").h' 
#reuslt : [
    {"h": 178}, {"h": 180}
]

조건은 아래와 같이 중첩하여 사용할 수 있다.

'$.height[*] ? (@.d >= "2020-01-01").h ? (@ > 179)' 
#reuslt : [
    {"h": 180}
]

PostgreSQL JSON Document를 참조하면 JSON Path Language에 정규식을 사용할 수도 있고 경로 표현식 관련 Operator와 Methods를 사용할 수 있다. 위 예제들 보다 훨씬 복잡한 구조의 JSON 데이터에서 구체적인 값을 쉽게 구할 수 있다.

참고 출처 #

Incoming Links #

Related Data Sciences #

Suggested Pages #

0.0.1_20230725_7_v68