Document Db Request Continuation Token 第一次迭代时未设置
Document Db Request Continuation Token Not set on the 1st iteration
我有一个包含大约 1500 个文档的文档数据库 collection。我最终的目标是构建一个 api 并将上面的内容作为我的持久层。我阅读了文档 (https://azure.microsoft.com/en-us/blog/documentdb-paging-support-with-top-and-more-query-improvements/),其中提到通过提要选项使用 请求延续令牌 进行分页。
在控制台应用程序上使用以下方法来理解相同的内容:这里的问题是第一次执行查询时继续令牌=null,但第二次执行查询时继续令牌= "some value"
所以我的问题是,不应该在第一次设置延续令牌吗?还是我遗漏了一些明显的东西
//field
private static readonly FeedOptions DefaultOptions = new FeedOptions { EnableCrossPartitionQuery = true,MaxItemCount = 1};
//method
private static async Task<bool> QueryItemDocuments(string collectionLink)
{
IDocumentQuery<Item> query = client.CreateDocumentQuery<Item>(collectionLink, new SqlQuerySpec()
{
QueryText = "SELECT * FROM items",
},DefaultOptions).AsDocumentQuery();
var loopNumber = 0;
while (query.HasMoreResults)
{
loopNumber++;
var results=(await query.ExecuteNextAsync<Item>()).ToList();
Console.WriteLine("Count {0}",results.Count);
Console.WriteLine("Loopnumber :{0} Token {1}", loopNumber, DefaultOptions.RequestContinuation ?? "Null");
Console.WriteLine("Id: {0},Name: {1}", results[0].Id, results[0].Name);
}
return query.HasMoreResults;
}
sample results from console :
Count 1
Loopnumber :1 Token Null //why is this null?
Id: 1dbaf1d0-0125-11e0-88a8-005056957023,Name:Energy Drink
Count 1
Loopnumber :2 Token - RID:jq4gAIZqMwACBBBBBBB==#RT:1#TRC:1#PKRID:0
Id: 244a8230-0231-11e0-8c8b-005056957023,Name: Gluten Free Dish
Edits:理想情况下,我会在响应中发回延续令牌 headers 允许客户端在需要时获取更多内容(在我的网站上 api) - 所以我的方法想要
public Get(int? page=1,int? size=20)
所以当我用前 20 个发送回响应时,我需要发回延续令牌以便客户端请求更多:所以如果第一次没有设置延续令牌 - 这意味着当我检索第一批时共 20 个,我该怎么做?
你走在正确的轨道上。两个想法:
使用 HasMoreResults
和 ExecuteNext
时不需要手动处理延续标记。 HasMoreResults
检查是否有延续标记,当您调用 ExecuteNext
时,它会自动添加。
我怀疑你在第一轮看不到续集的原因是它即将离任 DefaultOptions
并且直到第二轮再次出去才更新 ExecuteNext
。我在想你在第二个循环中的输出实际上是第一个延续标记。
好的,所以我认为这可能是 SDK 中的错误或设计上的错误 - 不知道,但是当我使用 Document Db's rest end points
查询结果时 - continuation token
确实已设置关于第一批的回应。这是使用的示例代码:
private static async Task QueryItemDocumentsUsingRestApi()
{
//About rest end points to query documents here https://msdn.microsoft.com/en-us/library/azure/mt670897.aspx
IEnumerable<string> continuationTokens = null;
var continToken = string.Empty;
var verb = "POST";
var resourceType = "docs";
var resourceLink = string.Format("dbs/{0}/colls/{1}/docs", DatabaseName, CollectionName);
var resourceId = string.Format("dbs/{0}/colls/{1}", DatabaseName, CollectionName)
var authHeader = GenerateAuthSignature(verb, resourceId, resourceType, authorizationKey, "master", "1.0"); // look here for how this is generated https://github.com/Azure/azure-documentdb-dotnet/blob/master/samples/rest-from-.net/Program.cs
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("x-ms-date", _utcDate);
client.DefaultRequestHeaders.Add("x-ms-version", "2015-08-06");
client.DefaultRequestHeaders.Remove("authorization");
client.DefaultRequestHeaders.Add("authorization", authHeader);
client.DefaultRequestHeaders.Add("x-ms-documentdb-isquery", "True");
client.DefaultRequestHeaders.Add("x-ms-max-item-count", "5");
client.DefaultRequestHeaders.Add("x-ms-continuation", string.Empty);
var qry = new RestSqlQuery { query = "SELECT * FROM items" };
var result = client.PostWithNoCharSetAsync(new Uri(new Uri(endpointUrl), resourceLink), qry).Result;
var content = await result.Content.ReadAsStringAsync();
var pagedList = JsonConvert.DeserializeObject<PagedList>(content);
if (result.Headers.TryGetValues("x-ms-continuation", out continuationTokens))
{
continToken = continuationTokens.FirstOrDefault();
}
}
}
我有一个包含大约 1500 个文档的文档数据库 collection。我最终的目标是构建一个 api 并将上面的内容作为我的持久层。我阅读了文档 (https://azure.microsoft.com/en-us/blog/documentdb-paging-support-with-top-and-more-query-improvements/),其中提到通过提要选项使用 请求延续令牌 进行分页。
在控制台应用程序上使用以下方法来理解相同的内容:这里的问题是第一次执行查询时继续令牌=null,但第二次执行查询时继续令牌= "some value"
所以我的问题是,不应该在第一次设置延续令牌吗?还是我遗漏了一些明显的东西
//field
private static readonly FeedOptions DefaultOptions = new FeedOptions { EnableCrossPartitionQuery = true,MaxItemCount = 1};
//method
private static async Task<bool> QueryItemDocuments(string collectionLink)
{
IDocumentQuery<Item> query = client.CreateDocumentQuery<Item>(collectionLink, new SqlQuerySpec()
{
QueryText = "SELECT * FROM items",
},DefaultOptions).AsDocumentQuery();
var loopNumber = 0;
while (query.HasMoreResults)
{
loopNumber++;
var results=(await query.ExecuteNextAsync<Item>()).ToList();
Console.WriteLine("Count {0}",results.Count);
Console.WriteLine("Loopnumber :{0} Token {1}", loopNumber, DefaultOptions.RequestContinuation ?? "Null");
Console.WriteLine("Id: {0},Name: {1}", results[0].Id, results[0].Name);
}
return query.HasMoreResults;
}
sample results from console :
Count 1
Loopnumber :1 Token Null //why is this null?
Id: 1dbaf1d0-0125-11e0-88a8-005056957023,Name:Energy Drink
Count 1
Loopnumber :2 Token - RID:jq4gAIZqMwACBBBBBBB==#RT:1#TRC:1#PKRID:0
Id: 244a8230-0231-11e0-8c8b-005056957023,Name: Gluten Free Dish
Edits:理想情况下,我会在响应中发回延续令牌 headers 允许客户端在需要时获取更多内容(在我的网站上 api) - 所以我的方法想要
public Get(int? page=1,int? size=20)
所以当我用前 20 个发送回响应时,我需要发回延续令牌以便客户端请求更多:所以如果第一次没有设置延续令牌 - 这意味着当我检索第一批时共 20 个,我该怎么做?
你走在正确的轨道上。两个想法:
使用
HasMoreResults
和ExecuteNext
时不需要手动处理延续标记。HasMoreResults
检查是否有延续标记,当您调用ExecuteNext
时,它会自动添加。我怀疑你在第一轮看不到续集的原因是它即将离任
DefaultOptions
并且直到第二轮再次出去才更新ExecuteNext
。我在想你在第二个循环中的输出实际上是第一个延续标记。
好的,所以我认为这可能是 SDK 中的错误或设计上的错误 - 不知道,但是当我使用 Document Db's rest end points
查询结果时 - continuation token
确实已设置关于第一批的回应。这是使用的示例代码:
private static async Task QueryItemDocumentsUsingRestApi()
{
//About rest end points to query documents here https://msdn.microsoft.com/en-us/library/azure/mt670897.aspx
IEnumerable<string> continuationTokens = null;
var continToken = string.Empty;
var verb = "POST";
var resourceType = "docs";
var resourceLink = string.Format("dbs/{0}/colls/{1}/docs", DatabaseName, CollectionName);
var resourceId = string.Format("dbs/{0}/colls/{1}", DatabaseName, CollectionName)
var authHeader = GenerateAuthSignature(verb, resourceId, resourceType, authorizationKey, "master", "1.0"); // look here for how this is generated https://github.com/Azure/azure-documentdb-dotnet/blob/master/samples/rest-from-.net/Program.cs
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("x-ms-date", _utcDate);
client.DefaultRequestHeaders.Add("x-ms-version", "2015-08-06");
client.DefaultRequestHeaders.Remove("authorization");
client.DefaultRequestHeaders.Add("authorization", authHeader);
client.DefaultRequestHeaders.Add("x-ms-documentdb-isquery", "True");
client.DefaultRequestHeaders.Add("x-ms-max-item-count", "5");
client.DefaultRequestHeaders.Add("x-ms-continuation", string.Empty);
var qry = new RestSqlQuery { query = "SELECT * FROM items" };
var result = client.PostWithNoCharSetAsync(new Uri(new Uri(endpointUrl), resourceLink), qry).Result;
var content = await result.Content.ReadAsStringAsync();
var pagedList = JsonConvert.DeserializeObject<PagedList>(content);
if (result.Headers.TryGetValues("x-ms-continuation", out continuationTokens))
{
continToken = continuationTokens.FirstOrDefault();
}
}
}