title: Azure documentdb bulk insert using stored procedure
body: <p>Hi I am using 16 collections to insert around 3-4 million json objects ranging from 5-10k per object.I am using stored procedure to insert these documents.I have 22 Capacity Unit.</p>
  
  <pre class="lang-js prettyprint-override"><code>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 &amp;&amp; !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 &gt;= 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);
          }
      }
  </code></pre>
  
  <p>my C# codes looks like this</p>
  
  <pre class="lang-c# prettyprint-override"><code>    public async Task&lt;int&gt; Add(List&lt;JobDTO&gt; entities)
              {
  
                      int currentCount = 0;
                      int documentCount = entities.Count;
  
                      while(currentCount &lt; documentCount)
                      {
                          string argsJson = JsonConvert.SerializeObject(entities.Skip(currentCount).ToArray());
                          var args = new dynamic[] { JsonConvert.DeserializeObject&lt;dynamic[]&gt;(argsJson) };
  
                          // 6. execute the batch.
                          StoredProcedureResponse&lt;int&gt; scriptResult = await DocumentDBRepository.Client.ExecuteStoredProcedureAsync&lt;int&gt;(sproc.SelfLink, args);
  
                          // 7. Prepare for next batch.
                          int currentlyInserted = scriptResult.Response;
  
                          currentCount += currentlyInserted;
  
                      }
  
                      return currentCount;
              }
  </code></pre>
  
  <p>The problem I am facing is out of 400k documents that I try to insert at times documents get missed with out giving any error.</p>
  
  <p>The application is worker role deployed on cloud.
  If I increase the number of threads or instances inserting in documentDB the number of documents missed are much higher.</p>
  
  <p>how to figure out what is the problem.Thanks in Advance. </p>