【问题标题】:CosmosDB Paging Return ValueCosmosDB 分页返回值
【发布时间】:2018-07-02 23:07:44
【问题描述】:

我正在尝试返回来自 CosmosDB 的请求的分页结果。我从here 看到了这个例子,但我不确定如何处理response 变量。

// Fetch query results 10 at a time.
var queryable = client.CreateDocumentQuery<Book>(collectionLink, new FeedOptions { MaxItemCount = 10 });
while (queryable.HasResults)
{
    FeedResponse<Book> response = await queryable.ExecuteNext<Book>();
}

我想直接退货吗?还是我必须对 response 变量做进一步的事情?我试图直接返回响应变量,但它不起作用。这是我的代码:

 public async Task<IEnumerable<T>> RunQueryAsync(string queryString)
        {

            var feedOptions = new FeedOptions { MaxItemCount = 3 };
            IQueryable<T> filter = _client.CreateDocumentQuery<T>(_collectionUri, queryString, feedOptions);
            IDocumentQuery<T> query = filter.AsDocumentQuery();
            var response = new FeedResponse<T>();
            while (query.HasMoreResults)
            {
                response = await query.ExecuteNextAsync<T>();
            }
            return response;
        }

更新: 阅读@Evandro Paula 的回答后,我遵循URL 并将我的实现更改为以下。但它仍然给我 500 状态码:

 public async Task<IEnumerable<T>> RunQueryAsync(string queryString)
        {
            var feedOptions = new FeedOptions { MaxItemCount = 1 };
            IQueryable<T> filter = _client.CreateDocumentQuery<T>(_collectionUri, queryString, feedOptions);
            IDocumentQuery<T> query = filter.AsDocumentQuery();
            List<T> results = new List<T>();
            while (query.HasMoreResults)
            {
                foreach (T t in await query.ExecuteNextAsync())
                {
                    results.Add(t);
                }
            }
            return results;
        }

这是异常消息:

跨分区查询是必需的,但已禁用。请设置 x-ms-documentdb-query-enablecrosspartition 为 true,指定 x-ms-documentdb-partitionkey,或修改您的查询以避免这种情况 例外。,Windows/10.0.17134 documentdb-netcore-sdk/1.9.1

更新 2: 我将EnableCrossPartitionQuery 添加为true,并且能够从CosmosDB 获得响应。但我无法获得我定义的 1 项。相反,我得到了 11 件物品。

【问题讨论】:

    标签: rest azure asp.net-core azure-cosmosdb paging


    【解决方案1】:

    在下面找到一个关于如何使用 CosmosDB/SQL 分页查询的简单示例:

        private static async Task Query()
        {
            Uri uri = new Uri("https://{CosmosDB/SQL Account Name}.documents.azure.com:443/");
            DocumentClient documentClient = new DocumentClient(uri, "{CosmosDB/SQL Account Key}");
    
            int currentPageNumber = 1;
            int documentNumber = 1;
    
            IDocumentQuery<Book> query = documentClient.CreateDocumentQuery<Book>("dbs/{CosmoDB/SQL Database Name}/colls/{CosmoDB/SQL Collection Name}", new FeedOptions { MaxItemCount = 10 }).AsDocumentQuery();
    
            while (query.HasMoreResults)
            {
                Console.WriteLine($"----- PAGE {currentPageNumber} -----");
    
                foreach (Book book in await query.ExecuteNextAsync())
                {
                    Console.WriteLine($"[{documentNumber}] {book.Id}");
                    documentNumber++;
                }
    
                currentPageNumber++;
            }
        }
    

    根据您的问题中描述的例外情况需要跨分区查询但已禁用,请按如下方式更新提要选项:

    var feedOptions = new FeedOptions { MaxItemCount = 1, EnableCrossPartitionQuery = true};
    

    https://github.com/Azure/azure-documentdb-dotnet/blob/d17c0ca5be739a359d105cf4112443f65ca2cb72/samples/code-samples/Queries/Program.cs#L554-L576 上查找更全面的示例。

    【讨论】:

    • 感谢您的回复。我按照您提供的网址进行了操作,但由于某种原因它仍然无法正常工作。我已经添加到上面问题的最后一部分。谢谢!
    • 请用您看到的异常更新问题。
    • 将提要选项更改为 var feedOptions = new FeedOptions { MaxItemCount = 1, EnableCrossPartitionQuery = true};
    • 是的,你是对的。我能够从 CosmosDB 获得响应,但我得到了所有项目,而不是我指定的 1 个项目。
    • 这是因为您在返回之前将 all 个结果添加到列表中(例如 while (query.HasMoreResults){})。
    【解决方案2】:

    您没有为您的特定项目指定任何 where 标准...因此您将获得所有结果..尝试为您正在寻找的项目(id、名称等)指定标准。请记住,跨分区查询会消耗更多的 RUs n 时间,您可以重新访问数据模型的架构。理想情况下,始终在同一分区中进行查询

    【讨论】:

    • 但是我认为 MaxItemCount 是定义一页中有多少个文档的那个。。为什么我们需要指定更多的条件?
    • 总共可能有 11 个文档...页面大小为 1(MaxItemCount) ...但查询执行 11 次,直到所有记录为止。但如果您需要一些特定的项目,你需要通过 linq Where 添加条件
    • 删除query.HasMoreResults..它应该只返回1个文档,但可以是任何随机文档
    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2019-04-23
    • 2015-12-05
    • 2018-09-15
    相关资源
    最近更新 更多