2016-07-26 68 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

謝謝你的解釋和補充信息。 –

相關問題