我只是尝试使用简单的.NET控制台程序浏览Azure DocumentDb集合中的所有文档:
using (var client = new DocumentClient(serviceEndPoint, authKey))
{
var feed = client.ReadDocumentFeedAsync(docsLink, new FeedOptions { MaxItemCount = -1 }).Result;
Console.WriteLine("feed.Count = {0}", feed.Count);
Console.WriteLine("feed.CurrentResourceQuotaUsage = {0}", feed.CurrentResourceQuotaUsage);
var count = 0;
foreach (var item in feed)
{
count++;
}
Console.WriteLine("Read count = {0}", count);
}
我的代码基于the official sample on github。
尽管使用MaxItemCount = -1(对于动态页面大小调整),我总是得到以下结果:
feed.Count = 9700
feed.CurrentResourceQuotaUsage = documentSize=612;documentsSize=515130;documentsCount=425200;collectionSize=627243;
Read count = 9700
所以我的集合包含超过400k的文档,但是只返回第一批9700文档。
azure门户网站指标(以及我的知识)确认有425k个文档:
我尝试手动设置MaxItemCount
,但结果仅限于前9700项。
那么,我的代码有什么问题?
答案 0 :(得分:2)
您的代码中缺少的是处理延续令牌。基本上发生的事情是每个请求都被分配了一定的执行时间,并尝试在分配的时间内返回最大数据。如果有更多数据,它将返回您将使用的延续令牌并再次执行您的查询。由于您要获取所有记录,因此您将执行循环,直到时间服务返回连续令牌。
请参阅下面的示例代码(我还没有尝试过运行它。)
using (var client = new DocumentClient(serviceEndPoint, authKey))
{
string continuationToken = null;
var count = 0;
do
{
var feed = client.ReadDocumentFeedAsync(docsLink, new FeedOptions { MaxItemCount = -1, RequestContinuation = continuationToken }).Result;
continuationToken = feed.ResponseContinuation;
Console.WriteLine("feed.Count = {0}", feed.Count);
Console.WriteLine("feed.CurrentResourceQuotaUsage = {0}", feed.CurrentResourceQuotaUsage);
foreach (var item in feed)
{
count++;
}
}
while (continuationToken != null);
Console.WriteLine("Read count = {0}", count);
}