Model.create() vs. Model.collection.insert():rychlejší přístup
Model.create() je špatný způsob, jak dělat vložky, pokud máte co do činění s velmi velkým objemem. Bude to velmi pomalé . V takovém případě byste měli použít Model.collection.insert , která funguje mnohem lépe . V závislosti na velikosti hromadného souboru Model.create() dokonce havaruje! Vyzkoušeno s milionem dokumentů, bez úspěchu. Pomocí Model.collection.insert trvalo to jen pár sekund.
Model.collection.insert(docs, options, callback)
docsje pole dokumentů, které mají být vloženy;optionsje volitelný konfigurační objekt – viz docscallback(err, docs)bude voláno po uložení všech dokumentů nebo po chybě. V případě úspěchu jsou dokumenty polem trvalých dokumentů.
Jak zde autor Mongoose zdůrazňuje, tato metoda obejde veškeré ověřovací procedury a přistoupí přímo k ovladači Mongo. Je to kompromis, který musíte udělat, protože nakládáte s velkým množstvím dat, jinak byste je vůbec nemohli vložit do databáze (nezapomeňte, že zde mluvíme o stovkách tisíc dokumentů).
Jednoduchý příklad
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);
}
}
Aktualizace 22. 6. 2019 :ačkoli insert() lze stále dobře používat, byla zastaralá ve prospěch insertMany() . Parametry jsou úplně stejné, takže to můžete použít jen jako náhradu za drop-in a vše by mělo fungovat v pořádku (no, návratová hodnota je trochu jiná, ale stejně ji pravděpodobně nepoužíváte).
Reference
- Dokumentace Mongo
- Aaron Heckman ve Skupinách Google diskutuje o hromadných vkládáních