2016-07-31 136 views
0

下一个SP运行在整个集合上,对每个文档执行一些处理,我放弃这里,然后用处理后的文档替换文档。DocumentDB,为什么replaceDocument请求被拒绝

您会看到SP正在反复调用返回的continuationToken,查询更多文档。

复制过去的SP并查看结果中的数字。 来自上次查询的文档没有被替换,它们被拒绝排队。

为什么?

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

回答

1

存储过程,就像在任何DocumentDB请求,被设置在一个有界时间间隔来执行。对于需要更多时间的请求,有一个延续机制。在存储过程中,每个集合操作都会返回布尔标志以指示请求是否可以排队。如果它是错误的,函数应该包装当前的请求,并从客户端返回一个全新的请求,其中延续令牌已被保留到目前为止。

在您的代码中,如果您发现documentsRejectFromQueue非零,则表示请求已用完单向往返执行时间。但是,您可以使用从响应中获得的连续令牌从客户端发送新的请求,并循环,直到您从回复中找不到连续令牌。

更多细节可以在这里找到 - https://azure.microsoft.com/en-us/documentation/articles/documentdb-programming

+0

注意有两个部分,一个是要求一些文件,二是替换它们。如果已请求1000个文档,现在无法替换。 continuationToken(如何是请求的一部分,而不是替换)使我继续请求下一个文档并跳过那些未被替换的文档。 @ShireeshThota –