2016-05-22 15 views
5

Mam obecnie kolekcję w Mongodb, powiedz "Kolekcja1". Mam następujące tablice obiektów, które muszą być wprowadzone do MongoDB. Używam API Mongoose. Na razie powtarzam iterację i wstawiam każdą z nich w mongo. To na razie ok, ale będzie to problem, gdy dane będą zbyt duże. Potrzebuję sposobu na masowe wstawianie danych do MongoDB bez powtórzeń. Nie jestem pewien, jak to zrobić. Nie mogłem znaleźć opcji zbiorczej w Mongoose.Wstawianie luzem w MongoDB za pomocą mangusty

Mój kod poniżej

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); 
    } 

Odpowiedz

0

można przekazać tablicę obiektów do mangusta funkcja modelu tworzenia

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

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

może chcesz użyć metody insertMany() tutaj, jeśli jesteś przy użyciu najnowsza wersja Mongoose 4.4.X i większa, która zasadniczo używa Model.collection.insertMany() pod maską, a kierowca może obsługiwać paralle lizing >= 1000 dokumentów dla ciebie.

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

lub wykorzystujące Obietnice dla lepszej obsługi

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

Działa poprzez tworzenie kilka dokumentów, wzywa .validate() na nich równolegle, a następnie wywołuje błędu bazowego kierowcy insertMany() od wyniku toObject({ virtuals: false }); każdego dokumentu. Chociaż insertMany() nie uruchamia haków poprzedzających zapis, ma lepszą wydajność, ponieważ wykonuje tylko 1 podróż w obie strony do serwera, a nie 1 dla każdego dokumentu.


Dla Mongoose wersjach ~3.8.8, ~3.8.22, 4.x które wspierają MongoDB Server >=2.6.x, można użyć Bulk API następująco

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

Cześć, Próbuję dodać swoją drogę do dużej ilości danych z 'bulk' mangusta (Mam 409 584 danych do dodania), ale mam tylko 273001 danych. Wiesz dlaczego ? – John

+0

Jaka jest twoja wersja serwera MongoDB? – chridam

+0

Mam wersję MongoDB w wersji 3.2.9 i mangę 4.7.2. Jeśli używam insertMany otrzymałem 'FATAL ERROR: CALL_AND_RETRY_LAST Alokacja nie powiodła się - JavaScript heap out of memory' wtedy próbuję użyć metody bulk. – John

Powiązane problemy