2016-07-13 1 views
1

내 문서에서 승인 플래그를 끄려는 필드가 거의 없습니다 (게시, 가격, 설명).DocumentDB : 모든 레코드를 업데이트 할 수 없습니다 - 한 번에 100 개의 레코드 만 업데이트됩니다.

이 문제에 대해 먼저 문서의 모든 레코드에 대한 플래그를 끄고 고유 레코드에 대한 플래그를 설정합니다.

function SProc() { 
    var collection = getContext().getCollection(); 
    var collectionLink = collection.getSelfLink(); 
    var response = getContext().getResponse(); 
    var counter = 0; 
    var responseBody = { 
     updated: 0, 
     continuation: true, 
     error: "", 
     log: "" 
    }; 

    // Validate input. 
    getFullListOfPosts(); 

    // Recursively queries for a document by id w/ support for continuation tokens. 
    // Calls findDuplicates(document) as soon as the query returns a document. 
    function getFullListOfPosts(continuation) { 
     var query = { 
      query: "select * from root r ORDER BY r.created.epoch DESC" 
     }; 

     var requestOptions = { 
      continuation: continuation 
     }; 

     var isAccepted = collection.queryDocuments(collectionLink, query, requestOptions, proccessFullListOfPosts); 

     // If we hit execution bounds - throw an exception. 
     if (!isAccepted) { 
      responseBody.log += "Query not accepted"; 
      response.setBody(responseBody); 
      throw new Error("The stored procedure timed out"); 
     } 
    } 

    function proccessFullListOfPosts(err, documents, responseOptions) { 
     if (err) { 
      responseBody.error = err; 
      throw err; 
     } 
     if (documents.length > 0) { 
      responseBody.log += "Total records: " + documents.length; 
      var filtered = documents.filter(function(a) { 
       var key = a.posted_by + '|' + a.price + '|' + a.description + '|' + a.compare_price; 
       if (!this[key]) { 
        this[key] = true; 
        return true; 
       } 
      }, Object.create(null)) 
      for (var i = 0; i < documents.length; i++) { 
       var allRec = documents[i] 
       disableAllrecords(allRec); 
      } 
      for (var i = 0; i < filtered.length; i++) { 
       var uniqRec = filtered[i] 
       enableUniqueRecords(uniqRec); 
      } 
     } 
     if (responseOptions.continuation) { 
      // Else if the query came back empty, but with a continuation token; 
      // repeat the query w/ the token. 
      getFullListOfPosts(responseOptions.continuation); 
     } 
    } 

    function disableAllrecords(element) { 
     element.is_approved = false; 
     element.likes = 56; 
     responseBody.log += " Will disable " + element.id + element.is_approved + element.likes; 
     var requestOptions = { 
      etag: element._etag 
     }; 
     var isAccepted = collection.replaceDocument(element._self, element, requestOptions, function(err, updatedDocument, responseOptions) { 
      if (err) throw err; 
      counter++; 
      responseBody.log += " Disabled: " + element.id + " with approval:" + element.is_approved + " Likes:" + element.likes; 
     }); 
     if (!isAccepted) { 
      throw new Error("The stored procedure timed out while disabling"); 
     } 
    } 

    function enableUniqueRecords(x) { 
     x.is_approved = true; 
     x.likes = 65; 
     responseBody.log += " Will enable " + x.id + x.is_approved + x.likes; 
     var requestOptions = { 
      etag: x._etag 
     }; 
     var isAccepted = collection.replaceDocument(x._self, x, requestOptions, function(err, updatedDocument, responseOptions) { 
      if (err) throw err; 
      counter++; 
      responseBody.log += " Enabled: " + x.id + " with approval:" + x.is_approved + " Likes:" + x.likes; 
     }); 
     if (!isAccepted) { 
      throw new Error("The stored procedure timed out while enabling"); 
     } 
    } 
} 

enableUniqueRecords()에 오류가 발생합니다. 나는 왜 그리고 무엇이 잘못되었는지 이해할 수 없습니다.

은 말한다 :

Error: {"Errors":["One of the specified pre-condition is not met"]}

답변

1

아즈 하르, 나는 여기에서 실패하면 replaceDocument 호출 것 같다. 이 스크립트 (트랜잭션)가 시작된 후 다른 사람이 문서를 수정했기 때문에 _etag 전제 조건이 충족되지 않아서 실패해야합니다. 가능한 경우입니까?

스크립트 내에서 수정 된 문서를 처리하려면 클라이언트에서 다시 시도해야합니다. 당신이 할 수있는 일은 (1) 커스텀 메시지로 예외 (만약 스크립트 트랜잭션이 중단되기를 원할 때)를 던지거나 (2) 요청 본문에 커스텀 플래그를 설정하는 것입니다. ExecuteStoredProcedure 호출을 재 시도하십시오.

현재 저장 프로 시저의 경우 스크립트 시작 후 문서가 수정 된 경우 업데이트 문서가 스냅 숏 격리로 인해 실패하기 때문에 _etag 사전 조건이 필요하지 않습니다.