2016-07-28 16 views
0

次のSPは、コレクションを実行し、次のバッチのドキュメント(バッチごとに10ドキュメント)のクエリを保持するとします。代わりに毎回同じ10の文書を返す。あなたが書いたスクリプトでDocumentDB、SPでcontinuationTokenを使用する方法

function sample(prefix) { 
var continuations = [], 
ids = [], 
context = getContext(), 
    collection = context.getCollection(), 
    response = context.getResponse(); 
var queryOptions = { pageSize: 10, continuation: null }; 

for (i = 0; i < 10; i++) { 
    // get all user wish list actions 
    var query = "select * from w", 
    accept = collection.queryDocuments(collection.getSelfLink(), query, queryOptions, processMultiUsers); 
    if (!accept) throw "Unable to read user's sessions"; 
} 
getContext().getResponse().setBody(ids); 


function processMultiUsers(err, docs, options) { 
    if (err) throw new Error("Error: " + err.message); 
    if (docs == undefined || docs.length == 0) throw new Error("Warning: Users not exists"); 

    for (j = 0; j < docs.length; j++) { 
     ids.push(docs[j].UserId); 
    } 
    queryOptions.continuation = options.continuation; 
    continuations.push(options.continuation); 
}} 
+0

探しているものを達成するのを助ける必要があります。あるいは、この仕組みを調べることができます:https://github.com/lmaccherone/documentdb-utils/blob/master/sprocs/countDocuments.coffeeまたはここに戻って、他の質問に答えられていない質問を私は助けてうれしい。 :-) –

答えて

0

、クエリの実行は同期的に行われており、それらがnullである同じ初期継続トークン、でキューに入れられています。代わりに、最初のクエリからトークンを取得し、次のクエリをキューに入れて続行する必要があります。

以下のサンプルでは、​​私はちょうどあなたのカウントの質問に書いた答えでかいま見を取り、それがあなたの質問に答えるかどうかを確認あなたは

function sample(continuationToken) { 
    var collection = getContext().getCollection(); 
    var maxResult = 10; 
    var documentsProcessed = 0; 
    var ids = []; 
    var filterQuery = "select * from w"; 

    tryQuery(continuationToken); 

    function tryQuery(nextContinuationToken) { 
     var responseOptions = { continuation: nextContinuationToken, pageSize: maxResult }; 
     if (documentsProcessed >= maxResult || !query(responseOptions)) { 
      setBody(nextContinuationToken); 
     } 
    } 

    function query(responseOptions) { 
     return (filterQuery && filterQuery.length) ? 
      collection.queryDocuments(collection.getSelfLink(), filterQuery, responseOptions, onReadDocuments) : 
      collection.readDocuments(collection.getSelfLink(), responseOptions, onReadDocuments); 
    } 

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

     documentsProcessed += docFeed.length; 

     for (var i = 0; i < documentsProcessed; i++) { 
      ids.push(docFeed[i].UserId); 
     } 

     if (responseOptions.continuation) { 
      tryQuery(responseOptions.continuation); 
     } else { 
      setBody(null); 
     } 
    } 

    function setBody(continuationToken) { 
     var body = { continuationToken: continuationToken, documentsProcessed: documentsProcessed, ids: ids }; 
     getContext().getResponse().setBody(body); 
    } 
} 
+0

ありがとう@Shireesh、それは仕事をします。なぜ私は2つの異なるもののように同じ変数 "maxResult"を入れているのか理解できません。 1つはプルしたいそれぞれの要求のサイズ、もう1つは合計でプルしたいドキュメントの制限です。 –

+0

@GuyAssaf - maxResultは、主に最終応答の全体的な文書数を制御することを目的としていますが、ページサイズとして各往復の要求された最大結果となるように設定することもできます。 pageSize = 'x'を設定すると、ラウンドトリップがatmost(<=)x個の結果を得ることが約束されます。したがって、同じ値を使用することによって、可能な限り往復回数を最小限に抑えるようにしています。 –

+0

処理したい文書の量に制限がある場合は、同じ量のページサイズを要求する方がよいので、2回要求しないことを意味します。最大の結果がない場合、私はすべてを必要としますか? @ GuyAssafと正確には –

関連する問題