2016-07-31 25 views
0

次のSPがコレクション全体を実行する場合、各ドキュメントでいくつかの処理を行いますが、ここでは破棄してから処理したドキュメントに置き換えます。DocumentDBのreplaceDocument要求が拒否された理由

返されたcontinuationTokenでSPが何度も何度も呼び出していることがわかります。

SPをコピーし、結果の数字を参照してください。 最後のクエリのドキュメントが置き換えられていないため、キューイングから拒否されました。

なぜですか?

SP:DocumentDB内の任意の要求等

function sample(continuationToken) { 

var continuations = []; 
var pSize = 100000; 
var filterQuery = "select * from w"; 
var documentsProcessed = 0; 
var querysCount = 0; 
var documentsReplaced = 0; 
var documentsRejectFromQueue = 0; 
var context = getContext(), 
    collection = context.getCollection(), 
    response = context.getResponse(); 

tryQuery(continuationToken); 


function tryQuery(nextContinuationToken) { 
    var options = { continuation: nextContinuationToken, pageSize: pSize }; 
    if (!query(options)) { 
     setBody(nextContinuationToken); 
    } 
} 

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

function processMultiUsers(err, docs, options) {  

    for (j = 0; j < docs.length; j++) { 
     documentsProcessed++; 
     processUser(docs[j]); 
    } 
    querysCount++; 

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


function processUser(doc, items) { 
    // do something with items... 
    doc.WishList = items; 

    var accept4 = collection.replaceDocument(doc._self, doc, { indexAction: "default" }, function (err, feed, options) { 
     if (err) throw err; 
    }); 
    if (!accept4) documentsRejectFromQueue++; 

} 

function setBody(continuationToken) { 
    var body = { continuationToken: continuationToken, documentsProcessed: documentsProcessed, QuerysCount: querysCount, DocumentsReplaced: documentsReplaced, DocumentsRejectFromQueue: documentsRejectFromQueue}; 
    getContext().getResponse().setBody(body); 
}} 

答えて

1

ストアドプロシージャは、制限された時間間隔で実行するように設定されています。より多くの時間が必要な要求に対しては、継続メカニズムがあります。ストアドプロシージャでは、各コレクション操作はブールフラグを返し、要求をキューに入れるかどうかを示します。それが偽であれば、関数は現在の要求をラップして、これまで保存されていた継続トークンを持つまったく新しい要求でクライアントから戻ってくるはずです。

documentRejectFromQueueに0以外の値が設定されていることがわかっている場合は、要求が1回の往復実行時間を使い果たしたことを示しています。ただし、応答から返された継続トークンを使用してクライアントから新しい要求を送信し、応答から継続トークンが返されなくなるまでループすることができます。

詳細はここで見つけることができます - https://azure.microsoft.com/en-us/documentation/articles/documentdb-programming

+0

お知らせは2つの部分があり、1は、いくつかの書類を要求している、第二には、それらを交換することです。 1000の文書が要求されていて、現在は置換に失敗した場合continuationToken(どのように要求の一部であり、置換ではありません)は、私が次の文書を要求し続け、どのように置き換えられなかったのかをスキップします。 @ShireeshThota –

関連する問題