Does Mongoose v3.6 + unterstützt Batch - Einsätze jetzt? Ich habe ein paar Minuten gesucht, aber alles, was zu dieser Abfrage passt, ist ein paar Jahre alt und die Antwort war ein eindeutiges Nein.
Bearbeiten:
Zum späteren Nachschlagen ist die Antwort zu verwenden Model.create()
. create()
Akzeptiert ein Array als erstes Argument, sodass Sie Ihre Dokumente zum Einfügen als Array übergeben können.
Antworten:
Model.create () vs Model.collection.insert (): ein schnellerer Ansatz
Model.create()
ist ein schlechter Weg, um Einfügungen zu machen, wenn Sie mit einer sehr großen Masse zu tun haben. Es wird sehr langsam sein . In diesem Fall sollten Sie verwendenModel.collection.insert
, was viel besser funktioniert . Abhängig von der Größe der MasseModel.create()
wird sogar abstürzen! Versucht mit einer Million Dokumenten, kein Glück. Die BenutzungModel.collection.insert
dauerte nur wenige Sekunden.docs
ist das Array der einzufügenden Dokumente;options
ist ein optionales Konfigurationsobjekt - siehe Dokumentationcallback(err, docs)
wird aufgerufen, nachdem alle Dokumente gespeichert wurden oder ein Fehler auftritt. Bei Erfolg ist docs das Array von persistierten Dokumenten.Wie der Autor von Mongoose hier betont, umgeht diese Methode alle Validierungsverfahren und greift direkt auf den Mongo-Treiber zu. Es ist ein Kompromiss, den Sie eingehen müssen, da Sie eine große Datenmenge verarbeiten, da Sie sie sonst überhaupt nicht in Ihre Datenbank einfügen könnten (denken Sie daran, dass es sich hier um Hunderttausende von Dokumenten handelt).
Ein einfaches Beispiel
Update 2019-06-22 : Obwohl es
insert()
immer noch einwandfrei verwendet werden kann, wurde es zugunsten von abgelehntinsertMany()
. Die Parameter sind genau gleich, Sie können sie also einfach als Ersatz verwenden und alles sollte einwandfrei funktionieren (der Rückgabewert ist etwas anders, aber Sie verwenden ihn wahrscheinlich trotzdem nicht).Referenz
quelle
Model.collection
direkt durch den Mongo-Treiber geht, verlieren Sie alle ordentlichen Mungo-Sachen, einschließlich Validierung und Haken. Nur etwas zu beachten.Model.create
verliert die Haken, durchläuft aber noch die Validierung. Wenn Sie alles wollen, müssen Sie iterieren undnew MyModel()
Mongoose 4.4.0 unterstützt jetzt Bulk Insert
Mongoose 4.4.0 führt --true-- Bulk Insert mit der Modellmethode ein
.insertMany()
. Es ist viel schneller als eine Schleife.create()
oder ein Array.Verwendung:
Oder
Sie können es verfolgen auf:
quelle
bulkWrite
? Siehe hier: stackoverflow.com/questions/38742475/…fatal error allocation failed
. Aber wenn ich collection.insert benutze, funktioniert es perfekt.dateCreated : { type: Date, default: Date.now },
In der Tat können Sie die "create" -Methode von Mongoose verwenden. Sie kann eine Reihe von Dokumenten enthalten. Siehe dieses Beispiel:
Die Rückruffunktion enthält die eingefügten Dokumente. Sie wissen nicht immer, wie viele Elemente eingefügt werden müssen (feste Argumentlänge wie oben), damit Sie sie durchlaufen können:
Update: Eine bessere Lösung
Eine bessere Lösung wäre,
Candy.collection.insert()
anstattCandy.create()
- wie im obigen Beispiel verwendet - zu verwenden, weil es schneller ist (create()
ruftModel.save()
jedes Element auf, damit es langsamer ist).Weitere Informationen finden Sie in der Mongo-Dokumentation: http://docs.mongodb.org/manual/reference/method/db.collection.insert/
(danke an arcseldon für den Hinweis)
quelle
{type:'jellybean'}
statt{type:'jelly bean'}
? Übrigens. Was für seltsame Typen sind das? Sind sie Teil der Mongoose API?type
in Mongoose normalerweise für die Bezeichnung der ADT eines Datenbankobjekts reserviert ist.Sie können eine Masseneinfügung mithilfe der mongoDB-Shell durchführen, indem Sie die Werte in ein Array einfügen.
quelle
YourModel.collection.insert()
collection.insert
Antwort wurde einige Wochen vor dieser Antwort gegeben und viel detaillierter erklärt.Sie können Masseneinfügungen mit Mungo als Antwort mit der höchsten Punktzahl durchführen. Aber das Beispiel kann nicht funktionieren, es sollte sein:
Verwenden Sie keine Schemainstanz für die Masseneinfügung, sondern verwenden Sie ein einfaches Kartenobjekt.
quelle
Hier sind beide Möglichkeiten zum Speichern von Daten mit insertMany und zum Speichern
1) Mungo speichert eine Reihe von Dokumenten
insertMany
in großen Mengen2) Mungo speichern Array von Dokumenten mit
.save()
Diese Dokumente werden parallel gespeichert.
quelle
Es scheint, dass bei der Verwendung von Mungo die Verwendung von mehr als 1000 Dokumenten begrenzt ist
Sie können verwenden:
Beim Testen mit 10000 Dokumenten ist dies jedoch fast doppelt so schnell:
quelle
Teilen von funktionierendem und relevantem Code aus unserem Projekt:
quelle
.insertMany
Lösung wurde bereits in dieser Antwort von 2016 angegeben (und erläutert) .