SDK でクエリを実行する
SDK の Microsoft.Azure.Cosmos.Container クラスには、クエリを作成し、そのクエリを Azure Cosmos DB for NoSQL に発行し、C# で非同期ストリームを設定し、項目を効率的にクライアントに返す一連の組み込みクラスがあります。
まず、すべての製品を返す単純な SQL コマンドを使用します。
SELECT * FROM products p
C# の同等のコマンド定義では 、QueryDefinition クラスが使用されます。
QueryDefinition query = new ("SELECT * FROM products p");
最初に、クエリを実行する項目の種類を表す C# 型を定義します。この例では、単純な C# Product クラスで十分です。
public class Product
{
public string id { get; set; }
public string name { get; set; }
public string price { get; set; }
}
次に、C# Product 型の GetItemQueryIterator ジェネリック メソッドを使用して、await foreach ループに入れます。 非同期ストリーム構造は、ループと改ページを自動的に処理してサーバーに移動し、後続の各結果ページを取得します。 foreach ループ内で、各項目を処理するコードを追加します。この例では、各項目の ID、 名前、および 価格 がコンソールに出力されます。
using (FeedIterator<Product> feedIterator = this.Container.GetItemQueryIterator<Product>(
query,
null,
new QueryRequestOptions() { }))
{
while (feedIterator.HasMoreResults)
{
foreach(var item in await feedIterator.ReadNextAsync())
{
Console.WriteLine($"[{item.productid}]\t{item.name,35}\t{item.price,15:C}");
}
}
}
azure-cosmos Python SDK には、SQL に似た構文を使用してデータのクエリを実行し、改ページ処理を処理し、結果をクライアントにストリーミングするための効率的なメソッドが用意されています。
まず、すべての製品を返す単純な SQL コマンドを使用します。
SELECT * FROM products p
Python では、このクエリを文字列として query_items メソッドに直接渡すことができます。
アイテムの構造を表す Python ディクショナリを定義します。 たとえば、次のような製品構造を考えてみます。
product = {
"id": "string",
"name": "string",
"price": "string"
}
次に、 query_items メソッドを使用します。 このメソッドは、SQL クエリ文字列とパーティション キーとその他の構成のオプションを受け入れます。 結果はループを使用して効率的にストリーミングされます。 ループ内で、各項目を処理するコードを追加します。この例では、各項目の ID、 名前、および 価格 がコンソールに出力されます。
query = "SELECT * FROM products p"
for item in container.query_items(
query=query,
enable_cross_partition_query=True):
print(f"{item['id']}\t{item['name']}\t{item['price']}")
JavaScript SDK を使用すると、クエリを作成し、Azure Cosmos DB for NoSQL にクエリを発行し、JavaScript で非同期ストリームを設定し、項目を効率的にクライアントに返すことができます。
まず、すべての製品を返す単純な SQL コマンドを使用します。
SELECT * FROM products p
JavaScript SDK を使用してこのクエリを実行するには、QuerySpec オブジェクトを作成するか、クエリ文字列を使用します。 コードでクエリ文字列を定義する方法を次に示します。
const query = "SELECT * FROM products p";
クエリ結果の構造化された処理では、Product データを表す JavaScript クラスを定義できます。
class Product {
constructor(id, name, price) {
this.id = id;
this.name = name;
this.price = price;
}
}
次に、 クエリ メソッドを使用して、 QueryIterator クラスのインスタンスを作成します。 このメソッドは、SQL クエリ文字列とパーティション キーとその他の構成のオプションを受け入れます。 非同期ストリーム構造は、ループと改ページを自動的に処理してサーバーに移動し、後続の各結果ページを取得します。 ループ内で、各項目を処理するコードを追加します。この例では、各項目の ID、 名前、および 価格 がコンソールに出力されます。
const iterator = container.items.query(
query,
{ enableCrossPartitionQuery: true }
);
while (iterator.hasMoreResults()) {
const { resources } = await iterator.fetchNext();
for (const item of resources) {
console.log(`[${item.id}] ${item.name.padEnd(35)} ${item.price.toFixed(2)}`);
}
}
Product クラスを使用してアイテムを表す場合は、次のコードを使用できます。
const iterator = container.items.query(
query,
{ enableCrossPartitionQuery: true }
);
while (iterator.hasMoreResults()) {
const { resources } = await iterator.fetchNext();
// Bind the results to the Product class.
const products = resources.map((product) => {
return new Product(product.id, product.name, 0);
});
}