CosmosDB 分页 Return 值
CosmosDB Paging Return Value
我正在尝试 return 分页结果来自 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>();
}
我应该直接 return 吗?或者我是否必须对 response
变量做进一步的事情?我试图直接 return 响应变量,但它不起作用。这是我的代码:
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;
}
这是异常消息:
Cross partition query is required but disabled. Please set
x-ms-documentdb-query-enablecrosspartition to true, specify
x-ms-documentdb-partitionkey, or revise your query to avoid this
exception., Windows/10.0.17134 documentdb-netcore-sdk/1.9.1
更新 2:
我将 EnableCrossPartitionQuery
添加到 true 并且我能够从 CosmosDB 获得响应。但是我无法获得我定义的 1 项。相反,我得到了 11 个项目。
在下面找到有关如何使用 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};
您没有为您的特定项目指定任何 where 条件...因此您将获得所有结果..尝试为您要查找的项目(id、名称等)指定条件。请记住,跨分区查询 n 次消耗更多的 RU,您可以重新访问数据模型的体系结构。理想情况下,始终在同一分区中进行查询
我正在尝试 return 分页结果来自 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>();
}
我应该直接 return 吗?或者我是否必须对 response
变量做进一步的事情?我试图直接 return 响应变量,但它不起作用。这是我的代码:
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;
}
这是异常消息:
Cross partition query is required but disabled. Please set x-ms-documentdb-query-enablecrosspartition to true, specify x-ms-documentdb-partitionkey, or revise your query to avoid this exception., Windows/10.0.17134 documentdb-netcore-sdk/1.9.1
更新 2:
我将 EnableCrossPartitionQuery
添加到 true 并且我能够从 CosmosDB 获得响应。但是我无法获得我定义的 1 项。相反,我得到了 11 个项目。
在下面找到有关如何使用 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};
您没有为您的特定项目指定任何 where 条件...因此您将获得所有结果..尝试为您要查找的项目(id、名称等)指定条件。请记住,跨分区查询 n 次消耗更多的 RU,您可以重新访问数据模型的体系结构。理想情况下,始终在同一分区中进行查询