如何在DocumentDb .NET SDK上使用ReadDocumentFeedAsync?

时间:2017-09-29 14:56:33

标签: azure azure-cosmosdb

我只是尝试使用简单的.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个文档:

azure portal screenshot

我尝试手动设置MaxItemCount,但结果仅限于前9700项。

那么,我的代码有什么问题?

1 个答案:

答案 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);
        }