2016-07-31 168 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 –