Ciao Sto usando 16 raccolte per inserire circa 3-4 milioni di oggetti JSON che vanno da 5-10k per oggetto. Sto usando la stored procedure per inserire questi documenti. Ho 22 unità di capacità.Inserimento bulk documentdb di Azure mediante stored procedure
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);
}
}
miei C# codici appare come questa
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;
}
Il problema che sto affrontando è fuori 400k documenti che cerco di inserire a volte documenti inevasa con fuori dando alcun errore.
L'applicazione è un ruolo di lavoro distribuito su cloud. Se aumento il numero di thread o istanze che si inseriscono in documentDB, il numero di documenti persi è molto più alto.
come capire qual è il problema.Grazie in anticipo.
C'è qualcosa di utile in [questa domanda] (http://stackoverflow.com/questions/28186260/how-to-insert-into-documentdb-from-excel-file-contain-5000-records) (parla di eccezioni che potresti ottenere) o [questa domanda] (http://stackoverflow.com/questions/28318716/how-to-import-bulk-data-in-documentdb-from-excel) (fornisce un esempio di codice che potresti avere visto già)? – shoover
sì, l'ho già vistoper qualche motivo sconosciuto Documento db salta l'aggiunta di documenti quando l'inserimento è alla rinfusa ... Sto parlando di milioni di documenti qui ed è una specie di sporadico – varunpathak
potresti mandarmi una e-mail in modo che possiamo scavare in questo ancora un po '. avremmo bisogno di alcuni dettagli come nome dell'endpoint, ID attività ecc. –