다음을 통해 공유


Azure Cosmos DB for NoSQL에서 JSON 작업

적용 대상: NoSQL

Azure Cosmos DB for NoSQL에서 항목은 JSON으로 저장됩니다. 형식 시스템과 식이 JSON 형식만 처리하도록 제한됩니다. 자세한 내용은 JSON 사양을 참조하세요.

JSON 작업의 몇 가지 중요한 측면을 요약하겠습니다.

  • JSON 개체는 항상 { 왼쪽 중괄호로 시작하고 } 오른쪽 중괄호로 끝납니다.
  • JSON 속성은 서로 중첩될 수 있습니다.
  • JSON 속성 값은 배열이 될 수 있습니다.
  • JSON 속성 이름은 대/소문자를 구분합니다.
  • JSON 속성 이름은 임의의 문자열 값(공백이나 문자가 아닌 문자 포함)이 될 수 있습니다.

중첩 속성

점(.) 접근자를 사용하여 중첩된 JSON에 액세스할 수 있습니다. 다른 속성을 사용할 수 있는 것과 동일한 방법으로 쿼리에서 중첩된 JSON 속성을 사용할 수 있습니다.

다음은 중첩된 JSON을 사용하는 문서입니다.

{
  "name": "Teapo rainbow surfboard",
  "manufacturer": {
    "name": "AdventureWorks"
  },
  "releaseDate": null,
  "metadata": {
    "sku": "72109",
    "colors": [
      "cruise",
      "picton-blue"
    ],
    "sizes": {
      "small": {
        "inches": 76,
        "feet": 6.33333
      },
      "large": {
        "inches": 92,
        "feet": 7.66667
      }
    }
  }
}

이 경우 sku, colorssizes 속성이 모두 metadata 속성 내에 중첩됩니다. name 속성은 manufacturer 속성 내에도 중첩됩니다.

이 첫 번째 예제에서는 세 개의 중첩된 속성을 프로젝스합니다.

SELECT
    p.manufacturer.name,
    p.metadata.sku,
    p.metadata.sizes.small.inches AS size
FROM
    products p
[
  {
    "name": "AdventureWorks",
    "sku": "72109",
    "size": 76
  }
]

배열 작업

중첩된 속성 외에도 JSON은 배열을 지원합니다. 배열을 사용하여 작업하는 경우 해당 위치를 참조하여 배열 내의 특정 요소에 액세스할 수 있습니다.

이 예제에서는 특정 위치에 있는 배열 요소에 액세스합니다.

SELECT
    p.name,
    p.metadata.colors
FROM
    products p
WHERE
    p.metadata.colors[0] NOT LIKE "%orange%"
[
  {
    "name": "Teapo rainbow surfboard",
    "colors": [
      "cruise",
      "picton-blue"
    ]
  }
]

대부분의 경우 배열로 작업할 때 하위 쿼리 또는 셀프 조인을 사용합니다.

예를 들어 다음은 잠재적 배열 값과 교차 조인을 사용하여 여러 순열을 반환하는 쿼리입니다.

SELECT
    p.name,
    c AS color
FROM
    products p
JOIN
    c IN p.metadata.colors
[
  {
    "name": "Teapo rainbow surfboard",
    "color": "cruise"
  },
  {
    "name": "Teapo rainbow surfboard",
    "color": "picton-blue"
  }
]

또 다른 예제로 쿼리는 하위 쿼리와 함께 EXISTS를 사용할 수도 있습니다.

SELECT VALUE
    p.name
FROM
    products p
WHERE
    EXISTS (SELECT VALUE 
        c
    FROM
        c IN p.metadata.colors
    WHERE
        c LIKE "%picton%")
[
  "Teapo rainbow surfboard"
]

null과 undefined의 차이점

속성이 항목에 정의되지 않은 경우 해당 값은 undefined입니다. null 값을 가진 속성은 명시적으로 정의하고 null 값을 할당해야 합니다.

Azure Cosmos DB for NoSQL은 nullundefined 속성에 대한 두 가지 유용한 형식 검사 시스템 함수를 지원합니다.

  • IS_NULL - 속성 값이 null인지 확인합니다.
  • IS_DEFINED - 속성 값이 정의되어 있는지 아니면 undefined인지 확인합니다.

컨테이너의 각 항목에서 두 필드를 확인하는 예제 쿼리는 다음과 같습니다.

SELECT
    IS_NULL(p.releaseDate) AS isReleaseDateNull,
    IS_DEFINED(p.releaseDate) AS isReleaseDateDefined,
    IS_NULL(p.retirementDate) AS isRetirementDateNull,
    IS_DEFINED(p.retirementDate) AS isRetirementDateDefined
FROM
    products p
[
  {
    "isReleaseDateNull": true,
    "isReleaseDateDefined": true,
    "isRetirementDateNull": false,
    "isRetirementDateDefined": false
  }
]

공통 연산자와 nullundefined 값의 동작에 대한 자세한 내용은 같음 및 비교 연산자를 참조하세요.

JSON의 예약 키워드 및 특수 문자

따옴표가 붙은 속성 연산자 []를 사용하여 속성에 액세스할 수 있습니다. 예를 들어 SELECT c.grade and SELECT c["grade"] 와 동일합니다. 이 구문은 공백, 특수 문자가 포함되어 있거나 SQL 키워드 또는 예약어와 이름이 동일한 속성을 이스케이프해야 할 때 유용합니다.

예를 들어 몇 가지 고유한 방법으로 속성을 참조하는 쿼리는 다음과 같습니다.

SELECT
    p.manufacturer.name AS dotNotationReference,
    p["manufacturer"]["name"] AS bracketReference,
    p.manufacturer["name"] AS mixedReference
FROM
    products p
[
  {
    "dotNotationReference": "AdventureWorks",
    "bracketReference": "AdventureWorks",
    "mixedReference": "AdventureWorks"
  }
]

JSON 식

쿼리 프로젝션은 JSON 식 및 구문을 지원합니다.

SELECT {
    "productName": p.name,
    "largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
    products p
[
  {
    "$1": {
      "productName": "Teapo rainbow surfboard",
      "largeSizeInFeet": 7.66667
    }
  }
]

이 예제에서 SELECT 절은 JSON 개체를 만듭니다. 샘플에 키가 없으므로 절은 암시적 인수 변수 이름 $<index-number>를 사용합니다.

이 예제에서는 명시적으로 동일한 필드의 이름을 지정합니다.

SELECT {
    "productName": p.name,
    "largeSizeInFeet": p.metadata.sizes.large.feet
} AS product
FROM
    products p
[
  {
    "product": {
      "productName": "Teapo rainbow surfboard",
      "largeSizeInFeet": 7.66667
    }
  }
]

또는 쿼리는 중복 필드의 이름을 지정하지 않도록 개체를 평면화할 수 있습니다.

SELECT VALUE {
    "productName": p.name,
    "largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
    products p
[
  {
    "productName": "Teapo rainbow surfboard",
    "largeSizeInFeet": 7.66667
  }
]

별칭 값

쿼리에서 별칭 값을 명시적으로 지정할 수 있습니다. 쿼리에 이름이 동일한 2개의 속성이 있을 경우 프로젝션된 결과에서 구분되도록 별칭 지정을 사용하여 속성 중 하나 또는 둘 다의 이름을 바꾸어야 합니다.

예제

다음 예제와 같이 별칭 지정에 사용되는 AS 키워드는 선택 사항입니다.

SELECT
    p.name,
    p.metadata.sku AS modelNumber
FROM
    products p
[
  {
    "name": "Teapo rainbow surfboard",
    "modelNumber": "72109"
  }
]

예약 키워드 또는 특수 문자를 사용한 별칭 지정 값

별칭 지정을 사용하여 공백, 특수 문자 또는 예약어를 포함하는 속성 이름으로 값을 프로젝션할 수 없습니다. 값의 프로젝션을 변경하려는 경우(예: 공백이 있는 속성 이름) JSON 식을 사용할 수 있습니다.

예를 들면 다음과 같습니다.

SELECT VALUE {
    "Product's name | ": p.name,
    "Model number => ": p.metadata.sku
}
FROM
    products p
[
  {
    "Product's name | ": "Teapo rainbow surfboard",
    "Model number => ": "72109"
  }
]