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)
docs
je pole dokumentů, které mají být vloženy;options
je 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