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
, colors
및 sizes
속성이 모두 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은 null
및 undefined
속성에 대한 두 가지 유용한 형식 검사 시스템 함수를 지원합니다.
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
}
]
공통 연산자와 null
및 undefined
값의 동작에 대한 자세한 내용은 같음 및 비교 연산자를 참조하세요.
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"
}
]