2014-06-16 19 views
8

Secondo MongoDB documentation:Qual è la dimensione massima dell'operazione batch di MongoDB?

Bulk Dimensione Funzionamento

un'operazione di massa può avere al massimo 1000 operazioni.

Tuttavia, ho potuto utilizzare sfuso con molto più grandi operazioni contare (circa 300k operazioni) usando Mongo 2.6 rinfusa operazioni API con nodo mongodb-nativa (collection.initializeUnorderedBulkOp() ecc)

È questo limite obsoleto, o mi manca qualcosa? Sai qual è il vero limite?

+0

La dimensione massima è un documento BSON i cui limiti attuali sono impostati su 16meg, ovvero come comunica MongoDB utilizzando i documenti BSON. – Sammaye

risposta

13

Ho aperto uno ticket in Jira di MongoDB. Hanno risposto che:

Sei corretto; questo limite necessita di alcuni chiarimenti nella documentazione. Il limite è sul server, ma i driver client nascondono il limite dagli sviluppatori di applicazioni dividendo le operazioni di massa in più batch.

+0

Non lo sapevo, grazie! – Sammaye

3

Questa è un'affermazione interessante, ed è nuova alla documentazione a partire dalla versione 2.6, quindi vedrete che questo non era presente nella sezione di riferimento per le versioni precedenti.

Ovviamente il limite reale è il limite di 16 MB BSON, in quanto sarebbe la dimensione massima di ciò che può essere inviato sul filo come ciò che è efficacemente un documento BSON. Ciò diventa più chiaro quando ti rendi conto che questa è un'API di conveillance sopra le cose come la forma runCommand di update come mostrato qui per "Bulk Updates", o in altro modo inserimenti che chiaramente possono semplicemente prendere questo modulo.

Il modo in cui di solito scriverei questo come esempio verificherebbe il modululo dell'attuale iterazione quando si aggiungono operazioni bulk e solo "esegui" ogni tanto. Non la sintassi esatta per il driver del nodo, ma in fondo:

var bulk = db.collection.initializeUnorderedBulkOp(); 
counter = 0; 

longArrayOrStream.forEach(function(doc) { 
    bulk.find({ "_id": doc._id }).update(
     { "$set": { "somefield": doc.somefield }}); 
    counter++; 

    if (counter % 500 == 0) { 
     bulk.execute(); 
     counter = 0; 
     bulk = db.collection.initializeUnorderedBulkOp(); 
    } 
}); 

if (counter > 0) 
    bulk.execute(); 

o qualcosa di simile a seconda di cosa si sta facendo. Quindi sarebbe significativamente inferiore rispetto ai volumi che si stanno utilizzando, ma essenzialmente in blocchi gestibili che non sono troppo grandi sulla rete e sono sicuramente al sicuro sotto i 16 MB.

Quindi il limite BSON è il limite assoluto assoluto, ma per motivi pratici e considerando anche che si potrebbe voler verificare lo stato di errore che si riceverà anche in un documento di grandi dimensioni in risposta, è probabile che si desideri mantenere questi in pezzi più piccoli.

È tutto meglio che eseguirlo un'operazione alla volta e non so se desidero davvero inviare fino a 16 MB sul filo in una volta e/o controllare una risposta di 16 MB per possibili errori.

Problemi correlati