Cvičení – čtení a dotazování položek

Dokončeno

Vzpomeňte si, že se očekává, že vaše aplikace bude přidávat položky do kontejneru Azure Cosmos DB for NoSQL a číst stejné položky zpět jako ověřování. V tomto okamžiku vaše aplikace úspěšně přidá položky do kontejneru. Položky můžete číst dvěma klíčovými způsoby: provedením čtení bodu nebo provedením dotazu.

V tuto chvíli existují tři klíčové požadavky:

  1. Načtení položky pomocí jedinečného identifikátoru i hodnoty klíče oddílu
  2. Vytvoření dotazu pomocí jednoduchého řetězce dotazu
  3. Stránkování výsledků dotazu pomocí iterátoru informačního kanálu

Illustration of icons indicating data being queried using a query.

Po dokončení tohoto cvičení bude vaše aplikace téměř připravená. Máte dotazy, které si můžou přečíst kategorii a položky produktu, které jste vytvořili dříve.

Načíst položku

Nejjednodušší způsob, jak načíst položku ve službě Azure Cosmos DB, je provést čtení bodu. Čtení bodů používá v porovnání s dotazy malý a předvídatelný počet RU. Tady si můžete přečíst helmy s jednou položkou kategorie, kterou jste vytvořili.

  1. Vraťte se do souboru Program.cs .

  2. Vytvořte novou instanci PartitionKey pro gear-climb-helmets.

    PartitionKey readKey = new("gear-climb-helmets");
    
  3. Pomocí Container.ReadItemAsync nasměrujte na čtení konkrétní položky pomocí vlastnosti ID a hodnoty klíče oddílu.

    ItemResponse<Category> readResponse = await container.ReadItemAsync<Category>(
        id: "91f79374-8611-4505-9c28-3bbbf1aa7df7",
        partitionKey: readKey
    );
    
  4. Získejte serializovaný obecný typ pomocí Resource vlastnost ItemResponse třídy.

    Category readItem = readResponse.Resource;
    
  5. Výstupem jedinečného identifikátoru a poplatku za požadavek na operaci čtení bodu.

    Console.WriteLine($"[Point read item]:\t{readItem.Id}\t(RUs: {readResponse.RequestCharge})");    
    
  6. Uložte soubor Program.cs.

Provedení dotazu

V situacích, kdy potřebujete více položek, můžete tyto položky najít a načíst pomocí dotazu. Vzpomeňte si, že jsme použili vlastnost klíče oddílu categoryId k seskupení položek do konkrétních kategorií. Pokud do dotazu zahrneme danou vlastnost, v podstatě vytvoříme dotaz s vymezeným oborem na jeden logický oddíl. Teď pomocí dotazu vyhledáte všechny položky v kategorii stanů .

  1. V souboru Program.cs vytvořte nový řetězec pro dotaz SELECT * FROM products p WHERE p.categoryId = 'gear-camp-tents'. Použijte však parametr pojmenovaný @partitionKeypro filtr categoryId .

    string statement = "SELECT * FROM products p WHERE p.categoryId = @partitionKey";
    
  2. Vytvořte novou instanci Třídy QueryDefinition s řetězcem dotazu.

    var query = new QueryDefinition(
        query: statement
    );
    
  3. Pomocí fluent WithParameter metoda přiřadit gear-camp-tents hodnotu parametru @partitionKey .

    var parameterizedQuery = query.WithParameter("@partitionKey", "gear-camp-tents");
    
  4. Pomocí Container.GetItemQueryIterator<> načtěte iterátor pro váš konkrétní dotaz.

    using FeedIterator<Product> feed = container.GetItemQueryIterator<Product>(
        queryDefinition: parameterizedQuery
    );
    
  5. Napište dotaz do konzoly.

    Console.WriteLine($"[Start query]:\t{statement}");
    
  6. Uložte soubor Program.cs.

Stránkování výsledků dotazu

Azure Cosmos DB automaticky rozdělí výsledky dotazu na stránky, které je možné načíst asynchronně. Pokud chcete tyto stránky spravovat, musíte kód jazyka C# napsat určitým způsobem, abyste měli jistotu, že načtete všechny stránky výsledků, které jsou k dispozici. Tady použijete smyčku while a foreach v jazyce C# k iteraci na stránkách výsledků.

  1. V souboru Program.cs vytvořte novou dvojitou proměnnou s názvem totalRequestCharge nastavenou na hodnotu 0.

    double totalRequestCharge = 0d;
    
  2. Vytvořte smyčku while , která iteruje, dokud FeedIterator.HasMoreResults vlastnost iterátoru informačního kanálu není false.

    while (feed.HasMoreResults)
    {
    }
    
  3. Uvnitř smyčky while získejte novou stránku výsledků pomocí Metody FeedIterator.ReadNextAsync.

    FeedResponse<Product> page = await feed.ReadNextAsync();
    
  4. Stále uvnitř smyčky while zvýšíte celkové poplatky za žádost pomocí hodnoty FeedResponse.RequestCharge.

    totalRequestCharge += page.RequestCharge;
    
  5. Ve smyčce While vytvořte novou smyčku foreach, která iteruje skutečné položky na stránce.

    foreach (Product item in page)
    {
    }
    
  6. Uvnitř smyčky foreach zapište do konzoly vlastnosti ID a názvu vrácené položky.

    Console.WriteLine($"[Returned item]:\t{item.Id}\t(Name: {item.Name ?? "N/A"})");
    
  7. Mimo smyčku While zapište do konzoly celkové poplatky za požadavky, které jste vypočítali.

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

    Tip

    Pokud si nejste jistí, jaký kód by měl být uvnitř smyčky a smyčky foreach nebo mimo tento kód, přejděte do části kontrola kódu v části Kontrola práce.

  8. Uložte soubor Program.cs.

Kontrola práce

Aplikace teď čte a dotazuje položky z kontejneru. Tady spustíte aplikaci, abyste mohli sledovat výsledky obou operací.

  1. Spusťte aplikaci .NET v terminálu:

    dotnet run
    
  2. Sledujte výstup spuštění aplikace. Výstup by se měl shodovat s následujícím příkladem:

    ...
    [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)
    

    Tip

    Jednotky RU zobrazené v tomto příkladu výstupu se můžou lišit od výstupu.

    Všimli jste si, že položka kategorie byla úspěšně deserializována do typu, který používáte pro produkty? Vzhledem k tomu, že položka kategorie neměla vlastnost názvu , byla tato vlastnost ponechána na výchozí hodnotě. Kontrola typů, správa schémat a serializace/deserializace jsou všechno, co může vaše aplikace spravovat zcela na straně klienta.