2016-05-22 9 views
5

Attualmente ho una collezione in Mongodb che dice "Raccolta1". Ho il seguente array di oggetti che devono essere inseriti in MongoDB. Sto usando API Mongoose. Per ora, sto iterando attraverso l'array e inserendo ognuno di essi in mongo. Questo è ok per ora, ma sarà un problema quando i dati sono troppo grandi. Ho bisogno di un modo per inserire i dati in blocco in MongoDB senza ripetizioni. Non sono sicuro di come farlo. Non sono riuscito a trovare un'opzione cumulativa in Mongoose.Inserto di massa in MongoDB usando mangusta

mio codice qui sotto

myData = [Obj1,Obj2,Obj3.......] 

myData.forEach(function(ele){ 
     //console.log(ele) 
    saveToMongo(ele); 
    }); 
function saveToMongo(obj){ 
    (new Collection1(obj)).save(function (err, response) { 
      if (err) { 
      // console.log('Error while inserting: ' + obj.name + " " +err); 
      } else { 
      // console.log('Data successfully inserted'); 
      } 
     }); 

     return Collection1(obj); 
    } 

risposta

0

è possibile passare un array di oggetti da mangusta modello creare funzione

var Collection1 = mongoose.model('Collection1'); 

Collection1.create(myData,function(err){ 
    if(err) ... 
}); 
16

Si potrebbe desiderare di utilizzare il metodo insertMany() qui se si sta utilizzando il ultima versione di Mongoose 4.4.X e successive, che essenzialmente utilizza Model.collection.insertMany() sotto il cofano e l'autista potrebbe gestire la paralle lizing >= 1000 documenti per voi.

myData = [Obj1, Obj2, Obj3.......]; 
Collection1.insertMany(myData, function(error, docs) {}); 

o utilizzando promesse per una migliore manipolazione

Collection1.insertMany(myData) 
    .then(function(docs) { 
     // do something with docs 
    }) 
    .catch(function(err) { 
     // error handling here 
    }); 

Esso funziona creando un gruppo di documenti, invita .validate() loro in parallelo, e quindi chiama errore del insertMany() sul risultato del conducente sottostante toObject({ virtuals: false }); di ciascun documento. Anche se insertMany() non attiva i hook di pre-salvataggio, ha prestazioni migliori perché effettua solo 1 round trip sul server anziché 1 per ciascun documento.


Per le versioni Mongoose ~3.8.8, ~3.8.22, 4.x che sostengono MongoDB Server >=2.6.x, si potrebbe utilizzare la Bulk API come segue

var bulk = Collection1.collection.initializeOrderedBulkOp(), 
    counter = 0; 

myData.forEach(function(doc) { 
    bulk.insert(doc); 

    counter++; 
    if (counter % 500 == 0) { 
     bulk.execute(function(err, r) { 
      // do something with the result 
      bulk = Collection1.collection.initializeOrderedBulkOp(); 
      counter = 0; 
     }); 
    } 
}); 

// Catch any docs in the queue under or over the 500's 
if (counter > 0) { 
    bulk.execute(function(err,result) { 
     // do something with the result here 
    }); 
} 
+0

Ciao, sto cercando il tuo modo di aggiungere molti dati con 'bulk' mangusta (Ho 409 584 dati da aggiungere) ma ho appena aggiunto 273001 dati. Sai perché ? – John

+0

Qual è la versione del tuo server MongoDB? – chridam

+0

Ho MongoDB versio 3.2.9 e mangusta 4.7.2. Se uso insertMany ho ottenuto 'FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory', quindi provo a utilizzare il metodo bulk. – John

Problemi correlati