Azure Cosmos DB vNext Emulator: 쿼리 및 관측 가능성 향상

발행: (2025년 12월 14일 오전 12:28 GMT+9)
6 min read
원문: Dev.to

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 – 계층 데이터 탐색

childrenpets 순으로 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"

(필요에 따라 특정 시나리오에 맞게 쿼리를 계속 구성하세요.)

Back to Blog

관련 글

더 보기 »