2015-02-27 14 views
5

Xin chào Tôi đang sử dụng 16 bộ sưu tập để chèn khoảng 3-4 triệu đối tượng json từ 5-10k cho mỗi đối tượng.Tôi đang sử dụng quy trình lưu trữ để chèn các tài liệu này.Chèn số lượng lớn documentdb Azure bằng cách sử dụng thủ tục lưu sẵn

function bulkImport(docs) { 
    var collection = getContext().getCollection(); 
    var collectionLink = collection.getSelfLink(); 

    // The count of imported docs, also used as current doc index. 
    var count = 0; 

    // Validate input. 
    if (!docs) throw new Error("The array is undefined or null."); 

    var docsLength = docs.length; 
    if (docsLength == 0) { 
     getContext().getResponse().setBody(0); 
    } 

    // Call the CRUD API to create a document. 
    tryCreateOrUpdate(docs[count], callback); 

    // Note that there are 2 exit conditions: 
    // 1) The createDocument request was not accepted. 
    // In this case the callback will not be called, we just call setBody and we are done. 
    // 2) The callback was called docs.length times. 
    // In this case all documents were created and we don't need to call tryCreate anymore. Just call setBody and we are done. 
    function tryCreateOrUpdate(doc, callback) { 
     var isAccepted = true; 
     var isFound = collection.queryDocuments(collectionLink, 'SELECT * FROM root r WHERE r.id = "' + doc.id + '"', function (err, feed, options) { 
      if (err) throw err; 
      if (!feed || !feed.length) { 
       isAccepted = collection.createDocument(collectionLink, doc, callback); 
      } 
      else { 
       // The metadata document. 
       var existingDoc = feed[0]; 
       isAccepted = collection.replaceDocument(existingDoc._self, doc, callback); 
      } 
     }); 

     // If the request was accepted, callback will be called. 
     // Otherwise report current count back to the client, 
     // which will call the script again with remaining set of docs. 
     // This condition will happen when this stored procedure has been running too long 
     // and is about to get cancelled by the server. This will allow the calling client 
     // to resume this batch from the point we got to before isAccepted was set to false 
     if (!isFound && !isAccepted) getContext().getResponse().setBody(count); 
    } 

    // This is called when collection.createDocument is done and the document has been persisted. 
    function callback(err, doc, options) { 
     if (err) throw err; 

     // One more document has been inserted, increment the count. 
     count++; 

     if (count >= docsLength) { 
      // If we have created all documents, we are done. Just set the response. 
      getContext().getResponse().setBody(count); 
     } else { 
      // Create next document. 
      tryCreateOrUpdate(docs[count], callback); 
     } 
    } 

mã C# của tôi trông như thế này

public async Task<int> Add(List<JobDTO> entities) 
      { 

        int currentCount = 0; 
        int documentCount = entities.Count; 

        while(currentCount < documentCount) 
        { 
         string argsJson = JsonConvert.SerializeObject(entities.Skip(currentCount).ToArray()); 
         var args = new dynamic[] { JsonConvert.DeserializeObject<dynamic[]>(argsJson) }; 

         // 6. execute the batch. 
         StoredProcedureResponse<int> scriptResult = await DocumentDBRepository.Client.ExecuteStoredProcedureAsync<int>(sproc.SelfLink, args); 

         // 7. Prepare for next batch. 
         int currentlyInserted = scriptResult.Response; 

         currentCount += currentlyInserted; 

        } 

        return currentCount; 
      } 

Vấn đề tôi đang phải đối mặt là ra khỏi 400k tài liệu mà tôi cố gắng để chèn vào văn bản lần bị bỏ lỡ với ra cho bất kỳ lỗi.

Ứng dụng là vai trò công nhân được triển khai trên đám mây. Nếu tôi tăng số lượng các chủ đề hoặc các trường hợp chèn vào trong documentDB thì số lượng tài liệu bị mất sẽ cao hơn nhiều.

cách tìm ra vấn đề là gì. Thanks in Advance.

+0

Có điều gì hữu ích trong [câu hỏi này] (http://stackoverflow.com/questions/28186260/how-to-insert-into-documentdb-from-excel-file-containing-5000-records) (nói về các ngoại lệ bạn có thể nhận được) hoặc [câu hỏi này] (http://stackoverflow.com/questions/28318716/how-to-import-bulk-data-in-documentdb-from-excel) (đưa ra một ví dụ mã mà bạn có thể có đã thấy)? – shoover

+0

vâng tôi đã thấy điều đó rồi ..vì một số lý do không rõ Tài liệu db bỏ qua thêm tài liệu khi chèn hàng loạt ... Tôi đang nói đến hàng triệu tài liệu ở đây và nó là loại lẻ tẻ – varunpathak

+0

bạn có thể vui lòng gửi email cho tôi để chúng tôi có thể đào sâu vào điều này không. chúng tôi sẽ cần một số chi tiết từ bạn như tên điểm cuối, hoạt động-id, v.v. –

Trả lời

3

Điều quan trọng cần lưu ý là các thủ tục được lưu trữ đã bị ràng buộc thực thi, trong đó tất cả các thao tác phải hoàn thành trong thời gian hết thời gian yêu cầu được chỉ định của máy chủ. Nếu một hoạt động không hoàn thành với giới hạn thời gian đó, giao dịch sẽ tự động được khôi phục. Để đơn giản hóa việc phát triển để xử lý các giới hạn thời gian, tất cả các hoạt động CRUD (Tạo, Đọc, Cập nhật và Xóa) trả về một giá trị Boolean đại diện cho dù thao tác đó sẽ hoàn thành. Giá trị Boolean này có thể được sử dụng một tín hiệu để kết thúc thực thi và để thực hiện một mô hình dựa trên tiếp tục để tiếp tục thực hiện (điều này được minh họa trong các mẫu mã của chúng tôi bên dưới).

Quy trình được lưu trữ chèn hàng loạt được cung cấp ở trên thực hiện mô hình tiếp tục bằng cách trả lại số lượng tài liệu được tạo thành công. Điều này được lưu ý trong các ý kiến ​​của thủ tục lưu trữ:

// If the request was accepted, callback will be called. 
    // Otherwise report current count back to the client, 
    // which will call the script again with remaining set of docs. 
    // This condition will happen when this stored procedure has been running too long 
    // and is about to get cancelled by the server. This will allow the calling client 
    // to resume this batch from the point we got to before isAccepted was set to false 
    if (!isFound && !isAccepted) getContext().getResponse().setBody(count); 

Nếu số lượng tài liệu đầu ra nhỏ hơn số lượng tài liệu đầu vào, bạn sẽ cần phải chạy lại thủ tục được lưu trữ với bộ tài liệu còn lại.

9

Tôi thấy rằng khi thử mã này, tôi sẽ gặp lỗi tại docs.length cho biết độ dài không xác định.

function bulkImport(docs) { 
    var collection = getContext().getCollection(); 
    var collectionLink = collection.getSelfLink(); 

    // The count of imported docs, also used as current doc index. 
    var count = 0; 

    // Validate input. 
    if (!docs) throw new Error("The array is undefined or null."); 

    var docsLength = docs.length; // length is undefined 
} 

Sau nhiều lần kiểm tra (không thể tìm thấy bất kỳ điều gì trong tài liệu Azure), tôi không thể chuyển mảng như được đề xuất. Tham số phải là một đối tượng. Tôi đã phải sửa đổi mã lô như thế này để nó chạy.

Tôi cũng thấy rằng tôi không thể đơn giản thử và chuyển một mảng tài liệu trong trình thám hiểm tập lệnh DocumentDB (hộp nhập liệu). Mặc dù trình giữ chỗ giúp văn bản cho biết bạn có thể.

Mã này đã làm việc cho tôi:

// psuedo object for reference only 
docObject = { 
    "items": [{doc}, {doc}, {doc}] 
} 

function bulkImport(docObject) { 
    var context = getContext(); 
    var collection = context.getCollection(); 
    var collectionLink = collection.getSelfLink(); 
    var count = 0; 

    // Check input 
    if (!docObject.items || !docObject.items.length) throw new Error("invalid document input parameter or undefined."); 
    var docs = docObject.items; 
    var docsLength = docs.length; 
    if (docsLength == 0) { 
     context.getResponse().setBody(0); 
    } 

    // Call the funct to create a document. 
    tryCreateOrUpdate(docs[count], callback); 

    // Obviously I have truncated this function. The above code should help you understand what has to change. 
} 

Hy vọng rằng Azure tài liệu sẽ bắt kịp hoặc trở nên dễ dàng hơn để tìm thấy nếu tôi bỏ lỡ nó.

Tôi cũng sẽ đặt báo cáo lỗi cho Trình khám phá tập lệnh với hy vọng rằng Azurites sẽ cập nhật.

Các vấn đề liên quan