2016-07-31 25 views
0

Der nächste SP über die gesamte Sammlung laufen, einige Prozesse auf jedem Dokument, die ich hier verwerfen, dann ersetzen Sie das Dokument mit dem verarbeiteten Dokument.DocumentDB, warum replaceDocument-Anfragen abgelehnt wurden

Sie werden sehen, die SP immer wieder mit der zurückgegebenen continuationToken aufrufen, Abfrage für weitere Dokumente.

kopieren Sie nach dem SP und sehen Sie die Zahlen in den Ergebnissen .. die Dokumente aus der letzten Abfrage wurde nicht ersetzt, sie wurden von der Warteschlange zurückgewiesen.

Warum?

SP:

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); 
}} 

Antwort

1

Stored Procedures, wie jede Anforderung in DocumentDB, gesetzt in einem beschränkten Zeitintervall auszuführen. Für eine Anfrage, die mehr Zeit benötigt, gibt es einen Fortsetzungsmechanismus. In gespeicherten Prozeduren gibt jede Sammlungsoperation das boolesche Flag zurück, um anzuzeigen, ob die Anforderung in die Warteschlange gestellt werden kann oder nicht. Wenn es falsch ist, sollte die Funktion die aktuelle Anforderung umbrechen und vom Client mit einer vollständig neuen Anforderung mit dem Fortsetzung-Token zurückkehren, das bis jetzt erhalten wurde.

Wenn Sie in Ihrem Code feststellen, dass documentsRejectFromQueue ungleich Null ist, weist dies darauf hin, dass die Ausführung der einzelnen Ausführungszeit für die Anforderung abgelaufen ist. Sie können jedoch eine neue Anforderung vom Client mit dem Fortsetzungstoken senden, das Sie von der Antwort erhalten haben, und eine Schleife ausführen, bis Sie kein Fortsetzungstoken von der Antwort erhalten haben.

Weitere Details finden sich hier - https://azure.microsoft.com/en-us/documentation/articles/documentdb-programming

+0

Hinweis gibt zwei Teile, so wird man einige Dokumente anfordert, ist die zweite, sie zu ersetzen. wenn 1000 Dokumente angefordert wurden und jetzt nicht ersetzt werden können. Der continuationToken (wie ist der Teil der Anfrage, nicht der Ersatz) lässt mich weiter die nächsten Dokumente anfordern und diejenigen überspringen, die nicht ersetzt wurden. @ShireeshThota –