2016-07-26 10 views
1

次のSPは、コレクション内のすべてのドキュメントを数え、一般的に完全なコレクションを処理する方法を学びます。何らかの理由ですべてのドキュメント、紺碧の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用の非同期コードの作成に慣れるには、しばらく時間がかかりました。あなたはそれを得るだろうと確信しています。私はそれが1000年、文書ページに戻った後、別のクエリを実行しようとするあなたのコールバックonReadDocuments()には何も表示されない

  • :ここで私が気づく事があります。 onReadDocuments()の中で、継続トークンがヌルではなく、受け入れられたものが依然として真であることをテストする必要があります。それらの条件の両方が満たされた場合には、再度この文を実行する必要があり、accepted = collection.readDocuments(collection.getSelfLink(), responseOptions, onReadDocuments);

  • または、onReadDocuments()の内側に、この行はおそらく、あなたがその上にそれを設定し、それので、ここで不要だresponseOptions.continuation = responseOptionsContinuation;、あなたが期待する何をしていませんコールバックが呼び出されるまで新しい値に設定されません。

  • onReadDocuments()の最後のパラメータとして、responseOptionsを使用すると、リクエストの提出オプションではなく、リクエストの返信ヘッダーであるため混乱します。それをちょうどoptionsに変更してください。

  • 継続トークンを参照する3つの異なる方法があり、設定したものを一貫して渡していないようです。提案、, execute responseOptions.continuation = options.continuation)continuationTokenからcontinuationTokenForThisSPROCExecution'. You already initialize it into the responseOptions so that's good, just update it to the new name. However, in onReadDocuments(にSPROCにパラメータを変更; `

  • だけで、SPROCをあなたが理解してくださいと前に何千-文書のページを呼びかけそれはタイムアウトします(私の経験では、アンロードされたシステムでは10,000以上)。したがって、あなたは上記の変更を考慮に入れていますが、sprocがタイムアウトした場合は、少し違って処理する必要があり、クライアント側でいくつかの作業が必要になります。最新の継続トークンを本体とクライアント側に戻す必要があります。継続トークンの応答がある場合は、その継続トークンを使用してsprocを再度呼び出す必要があります。その後、現在のカウントをsprocに渡してそれに追加し続ける必要があります。そうしないと、クライアント側にそれを累積する必要があります。

Hereは、CoffeeScript(JavaScriptにコンパイルされている)の完全に機能している例です。 documentdb-utilsを使用すると、完了するまでsprocを呼び出し続けることに注意してください。それ以外の場合は、自分で行う必要があります。

5

文書の合計数がDocumentDBによってヘッダーとして返されるようになりました。 これは、GET/colls/collectionName(.NETのReadDocumentCollectionAsync)を呼び出すことで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

説明と追加情報ありがとうございます。 –

関連する問題