Model.create() vs Model.collection.insert():szybsze podejście
Model.create()
to zły sposób na wkładki, jeśli masz do czynienia z bardzo dużą ilością. Będzie bardzo wolno . W takim przypadku powinieneś użyć Model.collection.insert
, który działa znacznie lepiej . W zależności od rozmiaru zbiorczego, Model.create()
nawet się rozbije! Próbowałem z milionem dokumentów, bez powodzenia. Korzystanie z Model.collection.insert
zajęło to tylko kilka sekund.
Model.collection.insert(docs, options, callback)
docs
to tablica dokumentów do wstawienia;options
jest opcjonalnym obiektem konfiguracyjnym - zobacz dokumentacjęcallback(err, docs)
zostanie wywołany po zapisaniu wszystkich dokumentów lub wystąpieniu błędu. W przypadku sukcesu, docs jest zbiorem utrwalonych dokumentów.
Jak wskazuje tutaj autor Mongoose, ta metoda ominie wszelkie procedury sprawdzania poprawności i uzyska bezpośredni dostęp do sterownika Mongo. Jest to kompromis, który musisz zrobić, ponieważ obsługujesz dużą ilość danych, w przeciwnym razie w ogóle nie będziesz w stanie wstawić ich do bazy danych (pamiętaj, że mówimy tutaj o setkach tysięcy dokumentów).
Prosty przykład
var Potato = mongoose.model('Potato', PotatoSchema);
var potatoBag = [/* a humongous amount of potato objects */];
Potato.collection.insert(potatoBag, onInsert);
function onInsert(err, docs) {
if (err) {
// TODO: handle error
} else {
console.info('%d potatoes were successfully stored.', docs.length);
}
}
Aktualizacja 22.06.2019 :chociaż insert()
nadal może być dobrze używany, został przestarzały na rzecz insertMany()
. Parametry są dokładnie takie same, więc możesz po prostu użyć go jako zamiennika i wszystko powinno działać dobrze (no cóż, wartość zwracana jest nieco inna, ale prawdopodobnie i tak jej nie używasz).
Odniesienie
- Dokumentacja Mongo
- Aaron Heckman w Grupach dyskusyjnych Google omawia wstawianie zbiorcze