연습 - 항목 읽기 및 쿼리

완료됨

애플리케이션은 Azure Cosmos DB for NoSQL 컨테이너에 항목을 추가하고 유효성 검사와 동일한 항목을 다시 읽어야 합니다. 이 시점에서 애플리케이션은 컨테이너에 항목을 성공적으로 추가합니다. 항목을 읽는 방법에는 포인트 읽기를 수행하거나 쿼리를 수행하는 두 가지 주요 방법이 있습니다.

현재 다음과 같은 세 가지 주요 요구 사항이 있습니다.

  1. 고유 식별자와 파티션 키 값을 모두 사용하여 항목 지점 읽기
  2. 간단한 쿼리 문자열을 사용하여 쿼리 만들기
  3. 피드 반복기를 사용하여 쿼리의 결과 페이지 매김

Illustration of icons indicating data being queried using a query.

이 연습을 완료하면 애플리케이션이 거의 준비된 것입니다. 이전에 만든 범주 및 제품 항목을 읽을 수 있는 쿼리를 사용할 수 있습니다.

항목 읽기 지점

Azure Cosmos DB에서 항목을 검색하는 가장 간단한 방법은 지점 읽기를 수행하는 것입니다. 지점 읽기는 쿼리에 비해 작고 예측 가능한 RU 수를 사용합니다. 여기서는 만든 helmets 단일 범주 항목을 읽습니다.

  1. Program.cs 파일을 반환합니다.

  2. gear-climb-helmets에 대한 새 PartitionKey 인스턴스를 만듭니다.

    PartitionKey readKey = new("gear-climb-helmets");
    
  3. Container.ReadItemAsyncid 속성 및 파티션 키 값을 사용하여 특정 항목을 포인트 읽기합니다.

    ItemResponse<Category> readResponse = await container.ReadItemAsync<Category>(
        id: "91f79374-8611-4505-9c28-3bbbf1aa7df7",
        partitionKey: readKey
    );
    
  4. ItemResponse 클래스의 Resource 속성을 사용하여 직렬화된 제네릭 형식을 가져옵니다.

    Category readItem = readResponse.Resource;
    
  5. 지점 읽기 작업의 고유 식별자 및 요청 요금을 출력합니다.

    Console.WriteLine($"[Point read item]:\t{readItem.Id}\t(RUs: {readResponse.RequestCharge})");    
    
  6. Program.cs 파일을 저장합니다.

쿼리 실행

여러 항목이 필요한 경우 쿼리를 사용하여 해당 항목을 찾고 검색할 수 있습니다. categoryId 파티션 키 속성을 사용하여 항목을 특정 범주로 그룹화했습니다. 쿼리에 해당 속성을 포함하는 경우 단일 논리 파티션으로 범위가 지정된 쿼리를 효과적으로 빌드합니다. 이제 쿼리를 사용하여 tents 범주의 모든 항목을 찾습니다.

  1. Program.cs에서 쿼리 SELECT * FROM products p WHERE p.categoryId = 'gear-camp-tents'에 대한 새 문자열을 만듭니다. 그러나 categoryId 필터에 @partitionKey라는 매개 변수를 사용합니다.

    string statement = "SELECT * FROM products p WHERE p.categoryId = @partitionKey";
    
  2. 쿼리 문자열을 사용하여 QueryDefinition 클래스의 새 인스턴스를 만듭니다.

    var query = new QueryDefinition(
        query: statement
    );
    
  3. Fluent WithParameter 메서드를 사용하여 gear-camp-tents 값을 @partitionKey 매개 변수에 할당합니다.

    var parameterizedQuery = query.WithParameter("@partitionKey", "gear-camp-tents");
    
  4. Container.GetItemQueryIterator<>를 사용하여 특정 쿼리에 대한 반복기를 검색합니다.

    using FeedIterator<Product> feed = container.GetItemQueryIterator<Product>(
        queryDefinition: parameterizedQuery
    );
    
  5. 콘솔에 쿼리를 씁니다.

    Console.WriteLine($"[Start query]:\t{statement}");
    
  6. Program.cs 파일을 저장합니다.

쿼리 결과 페이지 매김

Azure Cosmos DB는 자동으로 쿼리 결과를 비동기적으로 검색할 수 있는 페이지로 분할합니다. 이러한 페이지를 관리하려면 사용 가능한 결과의 모든 페이지를 검색할 수 있도록 특정한 방법으로 C# 코드를 작성해야 합니다. 여기서는 C#에서 whileforeach 루프를 사용하여 결과 페이지를 반복합니다.

  1. Program.cs에서 0의 값으로 설정된 totalRequestCharge라는 새 double 변수를 만듭니다.

    double totalRequestCharge = 0d;
    
  2. 피드 반복기의 FeedIterator 속성이 false가 될 때까지 반복되는 while 루프를 만듭니다.

    while (feed.HasMoreResults)
    {
    }
    
  3. While 루프 내에서 FeedIterator.ReadNextAsync 메서드를 사용하여 새 결과 페이지를 가져옵니다.

    FeedResponse<Product> page = await feed.ReadNextAsync();
    
  4. 계속 While 루프 내에서 FeedResponse.RequestCharge 값을 사용하여 총 요청 요금을 증분합니다.

    totalRequestCharge += page.RequestCharge;
    
  5. 계속 While 루프 내에서 새 foreach 루프를 만들어 페이지의 실제 항목을 반복합니다.

    foreach (Product item in page)
    {
    }
    
  6. foreach 루프 내에서 반환된 항목의 idname 속성을 콘솔에 씁니다.

    Console.WriteLine($"[Returned item]:\t{item.Id}\t(Name: {item.Name ?? "N/A"})");
    
  7. While 루프 외부에서 계산한 총 요청 요금을 콘솔에 씁니다.

    Console.WriteLine($"[Query metrics]:\t(RUs: {totalRequestCharge})");
    

    whileforeach 루프의 내부 또는 외부에 있어야 하는 코드가 무엇인지 잘 모르는 경우 작업 확인검토 코드 섹션으로 이동합니다.

  8. Program.cs 파일을 저장합니다.

작업 확인

이제 앱이 컨테이너에서 항목을 읽고 쿼리합니다. 여기에서 두 작업의 결과를 확인할 수 있도록 애플리케이션을 실행합니다.

  1. 터미널에서 .NET 애플리케이션 실행:

    dotnet run
    
  2. 실행되는 애플리케이션 출력을 확인합니다. 출력은 여기에 있는 예제와 일치해야 합니다.

    ...
    [Point read item]:      91f79374-8611-4505-9c28-3bbbf1aa7df7    (RUs: 1)
    [Start query]:          SELECT * FROM products p WHERE p.categoryId = @partitionKey
    [Returned item]:        5df21ec5-813c-423e-9ee9-1a2aaead0be4    (Name: N/A)
    [Returned item]:        e8dddee4-9f43-4d15-9b08-0d7f36adcac8    (Name: Cirroa Tent)
    [Returned item]:        e6f87b8d-8cd7-4ade-a005-14d3e2fbd1aa    (Name: Kuloar Tent)
    [Returned item]:        f7653468-c4b8-47c9-97ff-451ee55f4fd5    (Name: Mammatin Tent)
    [Returned item]:        6e3b7275-57d4-4418-914d-14d1baca0979    (Name: Nimbolo Tent)
    [Query metrics]:        (RUs: 2.94)
    

    이 예제 출력에 표시된 RU는 출력과 다를 수 있습니다.

    범주 항목이 제품에 사용하는 형식으로 역직렬화 되었음을 알 수 있나요? 범주 항목에 name 속성이 없으므로 해당 속성은 기본값으로 남아 있습니다. 형식 검사, 스키마 관리 및 직렬화/역직렬화는 애플리케이션이 클라이언트 쪽에서 완전히 관리할 수 있는 항목입니다.