Dotazování na položky ve službě Azure Cosmos DB for NoSQL pomocí .NET

PLATÍ PRO: NoSQL

Položky ve službě Azure Cosmos DB představují entity uložené v kontejneru. V rozhraní API for NoSQL se položka skládá z dat ve formátu JSON s jedinečným identifikátorem. Při vydávání dotazů pomocí rozhraní API pro NoSQL se výsledky vrátí jako pole JSON dokumentů JSON.

Dotazování na položky pomocí SQL

Azure Cosmos DB for NoSQL podporuje použití jazyk SQL (Structured Query Language) (SQL) k provádění dotazů na položky v kontejnerech. Jednoduchý dotaz SQL, jako je, SELECT * FROM products vrátí všechny položky a vlastnosti z kontejneru. Dotazy můžou být ještě složitější a mohou obsahovat konkrétní projekce polí, filtry a další běžné klauzule SQL:

SELECT 
    p.name, 
    p.description AS copy
FROM 
    products p 
WHERE 
    p.price > 500

Další informace o syntaxi SQL pro Azure Cosmos DB for NoSQL najdete v tématu Začínáme s dotazy SQL.

Dotazování na položku

Poznámka

Příklady v tomto článku předpokládají, že jste už definovali typ jazyka C#, který představuje vaše data s názvem Product:

// C# record type for items in the container
public record Product(
    string id,
    string category,
    string name,
    int quantity,
    bool sale
);

Pokud chcete dotazovat položky v kontejneru, zavolejte jednu z následujících metod:

Asynchronní dotazování na položky pomocí dotazu SQL

Tento příklad vytvoří dotaz SQL pomocí jednoduchého řetězce, načte iterátor informačního kanálu a pak použije vnořené smyčky k iteraci výsledků. Vnější smyčka while iteruje stránky výsledků, zatímco vnitřní smyčka foreach iteruje výsledky na stránce.

// Query multiple items from container
using FeedIterator<Product> feed = container.GetItemQueryIterator<Product>(
    queryText: "SELECT * FROM products"
);

// Iterate query result pages
while (feed.HasMoreResults)
{
    FeedResponse<Product> response = await feed.ReadNextAsync();

    // Iterate query results
    foreach (Product item in response)
    {
        Console.WriteLine($"Found item:\t{item.name}");
    }
}

Metoda Container.GetItemQueryIterator<> vrátí metodu FeedIterator<> , která se používá k iteraci vícestránkovým výsledkům. Vlastnost HasMoreResults označuje, jestli zbývá více stránek výsledků. Metoda ReadNextAsync získá další stránku výsledků jako výčet, který se pak použije ve smyčce k iteraci výsledků.

Případně můžete použít QueryDefinition k vytvoření dotazu SQL s parametrizovaným vstupem:

// Build query definition
var parameterizedQuery = new QueryDefinition(
    query: "SELECT * FROM products p WHERE p.category = @partitionKey"
)
    .WithParameter("@partitionKey", "gear-surf-surfboards");

// Query multiple items from container
using FeedIterator<Product> filteredFeed = container.GetItemQueryIterator<Product>(
    queryDefinition: parameterizedQuery
);

// Iterate query result pages
while (filteredFeed.HasMoreResults)
{
    FeedResponse<Product> response = await filteredFeed.ReadNextAsync();

    // Iterate query results
    foreach (Product item in response)
    {
        Console.WriteLine($"Found item:\t{item.name}");
    }
}

Tip

Parametrizované vstupní hodnoty můžou pomoct zabránit mnoha běžným útokům na injektáž dotazů SQL.

Asynchronní dotazování na položky pomocí LINQ

V tomto příkladu IQueryable<> se objekt používá k vytvoření jazyka LINQ (Language Integrated Query). Výsledky se pak iterují pomocí iterátoru informačního kanálu.

// Get LINQ IQueryable object
IOrderedQueryable<Product> queryable = container.GetItemLinqQueryable<Product>();

// Construct LINQ query
var matches = queryable
    .Where(p => p.category == "gear-surf-surfboards")
    .Where(p => p.sale == false)
    .Where(p => p.quantity > 10);

// Convert to feed iterator
using FeedIterator<Product> linqFeed = matches.ToFeedIterator();

// Iterate query result pages
while (linqFeed.HasMoreResults)
{
    FeedResponse<Product> response = await linqFeed.ReadNextAsync();

    // Iterate query results
    foreach (Product item in response)
    {
        Console.WriteLine($"Matched item:\t{item.name}");
    }
}

Metoda Container.GetItemLinqQueryable<> vytvoří IQueryable objekt pro sestavení dotazu LINQ. Pak se ToFeedIterator<> metoda použije k převodu výrazu dotazu LINQ na FeedIterator<>.

Tip

I když můžete iterovat přes IQueryable<>, tato operace je synchronní. Pomocí metody shromážděte ToFeedIterator<> výsledky asynchronně.

Další kroky

Teď, když jste se dotazovali na více položek, vyzkoušejte jeden z našich kompletních kurzů s rozhraním API pro NoSQL.