如何在cosmosDB中进行分页?

时间:2018-11-21 11:47:33

标签: azure-cosmosdb

我正在尝试对Cosmos db进行分页,但是skip命令出了点问题。

var resultDTO = this.client.CreateDocumentQuery<AuditDTO>(
             UriFactory.CreateDocumentCollectionUri(idDatabase, idCollection), queryOptions)

             .Skip(2*1)
             .Take(amount)
             .AsEnumerable()
             .ToList();

您知道如何实现吗?

2 个答案:

答案 0 :(得分:2)

当前,支持分页并且它基于continuation token.

以下示例说明了一种根据所需的页码,页面大小和连续标记查询文档的方法:

private static async Task<KeyValuePair<string, IEnumerable<CeleryTask>>> QueryCosmosDBPage(int pageNumber, int pageSize, string continuationToken)
{
    DocumentClient documentClient = new DocumentClient(new Uri("https://{CosmosDB/SQL Account Name}.documents.azure.com:443/"), "{CosmosDB/SQL Account Key}");

    var feedOptions = new FeedOptions {
        MaxItemCount = pageSize,
        EnableCrossPartitionQuery = true,

        // IMPORTANT: Set the continuation token (NULL for the first ever request/page)
        RequestContinuation = continuationToken 
    };

    IQueryable<CeleryTask> filter = documentClient.CreateDocumentQuery<CeleryTask>("dbs/{Database Name}/colls/{Collection Name}", feedOptions);
    IDocumentQuery<CeleryTask> query = filter.AsDocumentQuery();

    FeedResponse<CeleryTask> feedRespose = await query.ExecuteNextAsync<CeleryTask>();

    List<CeleryTask> documents = new List<CeleryTask>();
    foreach (CeleryTask t in feedRespose)
    {
        documents.Add(t);
    }
    return new KeyValuePair<string, IEnumerable<CeleryTask>>(feedRespose.ResponseContinuation, documents);
}

答案 1 :(得分:1)

CosmosDB尚不支持跳过跳转分页。团队正在努力。

但是有一些“欺骗”行为的方法。

您可以使用Cosmonaut,它使用.WithPagination(pageNum, pageSize)方法具有跳页分页支持。实现它的方法是通过浏览结果直到到达页面,但是有一些方法可以提高性能。

您可以阅读有关分页和分页建议的更多信息here

免责声明:我是宇航员的创建者