2016-07-26 67 views
1

下一个SP是对集合中所有文档进行统计的一个attampt,并且通常会了解如何处理整个集合。如何统计所有文档,azure DocumentDB

出于某种原因,接下来的SP返回

{ “计数”:0, “QueryCount”:0}

,而我希望它返回

{ “count”:1000,“QueryCount”:1}

SP:

function CountAll(continuationToken) { 
    var collection = getContext().getCollection(); 
    var results =0; 
    var queryCount = 0; 
    var pageSize = 1000; 
    var responseOptionsContinuation; 
    var accepted = true; 

    var responseOptions = { continuation: continuationToken, pageSize : pageSize}; 

    if (accepted) { 
     accepted = collection.readDocuments(collection.getSelfLink(), responseOptions, onReadDocuments); 
     responseOptions.continuation = responseOptionsContinuation; 
    } 
    setBody(); 



    function onReadDocuments(err, docFeed, responseOptions) { 
     queryCount++; 
     if (err) { 
      throw 'Error while reading document: ' + err; 
     } 

     results += docFeed.length; 
     responseOptionsContinuation = responseOptions.continuation; 
    } 

    function setBody() { 
     var body = { count: results, QueryCount: queryCount}; 
     getContext().getResponse().setBody(body); 
    } 
} 
+0

不知道我是否理解了这个问题,但是您可以在SQL/Linq中使用ORDER BY和LIMIT进行精确分页,或者您可以使用'options = new FeedOptions {MaxItemCount = 10}'进行近似分页。这有帮助吗? –

+0

寻呼正在帮助,如果我可以问下一页,直到我有所有的页面。其他方面,您如何查询20,000个文档? –

+0

您可以用MaxItemCount的-1指定“尽可能多”。我仍然没有跟随。你想做什么?你使用哪些代码来尝试这样做?你期望什么输出/响应?这与你实际得到的结果有什么不同? –

回答

1

您正处在正确的轨道上。只需要一些调整。您的麻烦似乎与您编写异步代码的方式相同。我花了一段时间习惯编写javascript的异步代码。我相信你会得到它的。下面是我看到的东西:

  • 我没有看到你的回调onReadDocuments()任何试图将其与1000文档页面返回后做另一个查询。在onReadDocuments()的内部,您需要测试continuation标记不为null,并且接受的标记仍然为true。如果这两方面的条件都满足,那么你应该再因为你设置它上面并执行该语句,accepted = collection.readDocuments(collection.getSelfLink(), responseOptions, onReadDocuments);

  • 而且,onReadDocuments()内,该行可能不会做你所期望的,responseOptions.continuation = responseOptionsContinuation;这是不必要在这里在调用回调之前不会被设置为新值。

  • 您使用responseOptions作为您的onReadDocuments()的最后一个参数会引起混淆,因为它是请求回复标题而不是请求提交选项。将其更改为options

  • 您似乎有三种不同的方式来引用延续标记,并且不一致地传入您设置的标记。 `

  • 只是要确保你了解,该存储过程并呼吁以前很多1000的文档页面;建议下,从参数到continuationTokencontinuationTokenForThisSPROCExecution'. You already initialize it into the responseOptions so that's good, just update it to the new name. However, in onReadDocuments(), execute responseOptions.continuation = options.continuation更改为存储过程它超时(根据我的经验,至少有10,000个卸载系统)。因此,您正在考虑上述更改,但如果sproc超时,则需要处理该更改,这会涉及到客户端的一些工作。您需要将最近的连续令牌传递回主体和客户端,如果您看到带有连续令牌的响应,则需要再次调用该副本(使用该连续令牌)。然后,您需要将当前计数传递回存储区,以便继续添加到该存储区,否则您需要将其累积到客户端。

Here是CoffeeScript(编译为JavaScript)中的一个完整的例子。请注意,如果您使用documentdb-utils,它将继续调用sproc直到完成。否则,你需要自己做。

5

请注意,DocumentDB现在将文档的总数作为标题返回。 你可以通过调用GET/colls /集合名(ReadDocumentCollectionAsync在.NET)执行此为O(1)操作

服务器今天返回此信息。不幸的是,今天SDK不公开此属性。我们将在下次刷新SDK时修复此问题。在此之前,你可以尝试这样做。

ResourceResponse<DocumentCollection> collectionReadResponse = await client.ReadDocumentCollectionAsync(…); 
String quotaUsage = collectionReadResponse.ResponseHeaders["x-ms-resource-usage"]; 

// Quota Usage is a semicolon(;) delimited key-value pair. 
// The key "documentCount" will return the actual count of document. 

这是标题的样子。

"functions=0;storedProcedures=0;triggers=0;documentSize=10178;documentsSize=5781669;documentsCount=17151514;collectionSize=10422760"; 

在这个例子中,文件的数量是〜17M(17151514)。

+0

谢谢你的解释和补充信息。 –

相关问题