クエリ結果をページ分割する

完了

Microsoft.Azure.Cosmos.Container クラスは、複数のページの結果を反復処理する最も簡単で簡単な方法で非同期ストリームをサポートします。 結果を手動でページ分割するシナリオでは、フィード反復子を取得して、結果の各ページを読み取ることができます。

まず、実行する SQL クエリ文字列を定義し、 QueryDefinition 型の変数のコンストラクター パラメーターとして使用します。

string sql = "SELECT * FROM products WHERE p.price > 500";
QueryDefinition query = new (sql);

次に、MaxItemCount プロパティを使用して QueryRequestOptions 型のオブジェクトを作成し、結果の各ページに対して返す項目の数を指定します。

QueryRequestOptions options = new()
{
    MaxItemCount = 100
};

最後に、ジェネリック型と <> メソッドを使用して新しい FeedIterator を作成します。

FeedIterator<Product> iterator = container.GetItemQueryIterator<Product>(query, requestOptions: options);

フィードイテレータクラスには、サーバー側で返すべきページがさらにあるかどうかを示す HasMoreResults というブール型プロパティが含まれています。 このプロパティは、while ループ内で使用するのに適しています。 反復子には、foreach ループで反復処理できる列挙可能なコレクションに次の項目のセットを取得する ReadNextAsync メソッドもあります。

while(iterator.HasMoreResults)
{
    foreach(Product product in await iterator.ReadNextAsync())
    {
        // Handle individual items
    }
}

Python SDK for Azure Cosmos DB では、結果を取得するための非同期反復処理がサポートされていますが、フィード反復子を使用して結果セットを手動で改ページすることもできます。 ページ分割と各ページのサイズを手動で制御するシナリオでは、これらのオプションを構成し、結果を段階的に取得できます。

まず、実行する SQL クエリ文字列を定義します。

sql = "SELECT * FROM products WHERE p.price > 500"

query_itemsメソッドを使用すると、max_item_countなどのオプションを指定して、ページごとに返される項目の数を制限できます。

iterator = container.query_items(
    query=query,
    enable_cross_partition_query=True,
    max_item_count=100  # Set maximum items per page
)

フィード反復子には、ページの反復子を返す by_page メソッドが含まれています。 各ページには、反復処理できる項目の一覧が含まれています。 for ループを使用して各ページを反復処理し、もう 1 つの for ループを使用して各項目を反復処理します。

for page in iterator.by_page():
    for product in page:
        print(f"[{product['id']}]	{product['name']}	${product['price']:.2f}")

Azure Cosmos DB JavaScript SDK の Container クラスは、結果間の改ページ位置を手動で管理するシナリオで、ページ分割されたクエリをサポートします。 このような場合は、フィード反復子を取得し、結果の各ページを読み取ることができます。

まず、実行する SQL クエリ文字列を定義します。

const query = "SELECT * FROM products WHERE products.price > 500";

クエリ反復子を作成するには、 container.items.query メソッドを使用します。 maxItemCount オプションを使用して、ページごとに返す項目の最大数を設定します。

const options = {
    maxItemCount: 100 // Set the maximum number of items per page
};

const iterator = container.items.query(query, options);

iterator.getAsyncIterator メソッドは、for await...of ループをフェッチして結果の各ページを取得するために使用できる非同期反復子を返します。 このループは、ページに対する非同期イテレーションを自動的に処理します。

for await (const page of iterator.getAsyncIterator()) {
    page.resources.forEach(product => {
        console.log(`[${product.id}] ${product.name} $${product.price.toFixed(2)}`);
    });
}