Azure Cosmos DB vNext Emulator: 쿼리 및 관측 가능성 향상
Source: Dev.to
쿼리 개선
이번 에뮬레이터 릴리스에서는 이전에 지원되지 않았던 여러 쿼리 패턴을 사용할 수 있게 되었습니다. 이 글에서는 쿼리 기능 향상에 대한 다음과 같은 개선 사항에 초점을 맞춥니다:
- 향상된 JOIN 연산 – 여러 배열 레벨에 걸친 중첩 JOIN, 교차 곱 JOIN, 원시 배열에 대한 자체 JOIN 지원
- 강화된 연산자 지원 – 문자열 조작 함수(
CONCAT,LENGTH)와 배열 연산(ARRAY_LENGTH, 직접 배열 인덱싱) 지원 - 향상된 서브문서 처리 – 깊게 중첩된 객체 속성에 대한 쿼리 개선 및 누락된 속성에 대한 올바른 처리
실제 예시를 통해 이를 살펴보겠습니다.
향상된 JOIN
Azure Cosmos DB에서 JOIN은 문서 내 데이터를 평탄화하고 탐색할 수 있게 하여 중첩 및 계층 구조 데이터를 다룰 수 있게 합니다.
아래는 각 문서가 가족을 나타내는 샘플 family 데이터셋이며, 중첩 배열을 포함하고 있습니다. 이 데이터셋은 Andersen, Wakefield, Miller 세 가족을 포함하며, 자녀와 애완동물 수가 다양해 JOIN이 다양한 데이터 구조를 어떻게 처리하는지 보여줍니다.
[
{
"id": "AndersenFamily",
"lastName": "Andersen",
"parents": [
{"firstName": "Thomas", "relationship": "father"},
{"firstName": "Mary Kay", "relationship": "mother"}
],
"children": [
{
"firstName": "Henriette",
"grade": 5,
"pets": [{"name": "Fluffy", "type": "Rabbit"}]
}
],
"tags": ["seattle", "active", "family-friendly"],
"address": {"state": "WA", "city": "Seattle"}
},
{
"id": "WakefieldFamily",
"lastName": "Wakefield",
"parents": [
{"firstName": "Robin", "relationship": "mother"},
{"firstName": "Ben", "relationship": "father"}
],
"children": [
{
"firstName": "Jesse",
"grade": 8,
"pets": [
{"name": "Goofy", "type": "Dog"},
{"name": "Shadow", "type": "Horse"}
]
},
{"firstName": "Lisa", "grade": 1, "pets": []}
],
"tags": ["newyork", "urban"],
"address": {"state": "NY", "city": "New York"}
},
{
"id": "MillerFamily",
"lastName": "Miller",
"parents": [{"firstName": "David", "relationship": "father"}],
"children": [
{
"firstName": "Emma",
"grade": 6,
"pets": [{"name": "Whiskers", "type": "Cat"}]
}
],
"tags": ["boston", "academic"],
"address": {"state": "MA", "city": "Boston"}
}
]
기본 JOIN – 배열 평탄화
children 배열을 평탄화하여 모든 가족의 자녀 목록(예: 학교 명단)을 생성합니다:
SELECT f.id, f.lastName, c.firstName, c.grade
FROM f
JOIN c IN f.children
결과: 각 자녀당 한 행 – Henriette(Andersen), Jesse와 Lisa(Wakefield), Emma(Miller).
필터가 있는 JOIN
특정 학년 범위에 해당하는 자녀를 찾습니다(예: 중학생, 학년 ≥ 6):
SELECT f.id, f.lastName, c.firstName, c.grade
FROM f
JOIN c IN f.children
WHERE c.grade >= 6
결과: Jesse(학년 8)와 Emma(학년 6)만.
중첩 JOIN – 계층 데이터 탐색
children → pets 순으로 JOIN을 연결하여 모든 애완동물과 소유자를 식별합니다:
SELECT f.id, c.firstName AS child, p.name AS pet, p.type
FROM f
JOIN c IN f.children
JOIN p IN c.pets
결과:
- Henriette – Fluffy (Rabbit)
- Jesse – Goofy (Dog) & Shadow (Horse)
- Emma – Whiskers (Cat)
(Lisa는 pets 배열이 비어 있어 제외되었습니다. 이는 내부 JOIN 동작을 보여줍니다.)
교차 곱 JOIN – 독립 배열 결합
각 자녀와 모든 가족 태그를 짝지어 패턴이나 선호도를 분석합니다:
SELECT f.id, c.firstName AS child, t AS tag
FROM f
JOIN c IN f.children
JOIN t IN f.tags
결과:
- Henriette는 세 번 나타납니다(태그: “seattle”, “active”, “family‑friendly”)
- Jesse와 Lisa는 각각 두 번 나타납니다(태그: “newyork”, “urban”)
- Emma는 두 번 나타납니다(태그: “boston”, “academic”).
원시 배열에 대한 JOIN
tags와 같은 단순 값 배열을 평탄화합니다:
SELECT f.id, f.lastName, t AS tag
FROM f
JOIN t IN f.tags
결과: 각 태그가 해당 가족과 연결된 별도의 행이 됩니다.
자체 JOIN – 조합 찾기
동일 배열을 다른 별칭으로 JOIN하여 어떤 태그가 자주 함께 나타나는지 찾습니다:
SELECT f.id, t1 AS tag1, t2 AS tag2
FROM f
JOIN t1 IN f.tags
JOIN t2 IN f.tags
WHERE t1 < t2
결과:
- Andersen 가족은 세 개의 고유한 쌍을 생성합니다: (“active”, “seattle”), (“active”, “family‑friendly”), (“family‑friendly”, “seattle”)
- Wakefield와 Miller 가족은 각각 두 개의 태그에서 한 쌍을 생성합니다.
복합 필터 – 다중 레벨 조건
루트 수준 속성과 깊게 중첩된 배열 요소를 결합합니다. 예를 들어, 워싱턴 주에 위치한 가족이 소유한 모든 토끼를 찾습니다:
SELECT f.id, f.lastName, c.firstName AS child, p.name AS pet, p.type
FROM f
JOIN c IN f.children
JOIN p IN c.pets
WHERE f.address.state = "WA" AND p.type = "Rabbit"
(필요에 따라 특정 시나리오에 맞게 쿼리를 계속 구성하세요.)