Est-ce que Mongoose v3.6 + inserts de traitement par lots de soutien maintenant? J'ai cherché pendant quelques minutes, mais tout ce qui correspond à cette requête date de quelques années et la réponse était un non sans équivoque.
Éditer:
Pour référence future, la réponse est d'utiliser Model.create()
. create()
accepte un tableau comme premier argument, vous pouvez donc transmettre vos documents à insérer sous forme de tableau.
Voir la documentation Model.create ()
Réponses:
Model.create () vs Model.collection.insert (): une approche plus rapide
Model.create()
est une mauvaise façon de faire des insertions si vous avez affaire à un très gros volume. Ce sera très lent . Dans ce cas, vous devez utiliserModel.collection.insert
, qui fonctionne beaucoup mieux . Selon la taille de la masse,Model.create()
va même planter! Essayé avec un million de documents, pas de chance. Son utilisationModel.collection.insert
n'a pris que quelques secondes.docs
est le tableau des documents à insérer;options
est un objet de configuration facultatif - voir la documentationcallback(err, docs)
sera appelé une fois que tous les documents auront été enregistrés ou qu'une erreur se produira. En cas de succès, docs est le tableau des documents persistants.Comme l'auteur de Mongoose le souligne ici , cette méthode contournera toutes les procédures de validation et accédera directement au pilote Mongo. C'est un compromis que vous devez faire puisque vous manipulez une grande quantité de données, sinon vous ne pourriez pas du tout l'insérer dans votre base de données (rappelez-vous que nous parlons ici de centaines de milliers de documents).
Un exemple simple
Mise à jour 2019-06-22 : bien que
insert()
puisse toujours être utilisée très bien, elle est obsolète au profit deinsertMany()
. Les paramètres sont exactement les mêmes, vous pouvez donc simplement l'utiliser comme un remplacement instantané et tout devrait fonctionner correctement (enfin, la valeur de retour est un peu différente, mais vous ne l'utilisez probablement pas de toute façon).Référence
la source
Model.collection
passe directement par le pilote Mongo, vous perdez tout le truc de mangouste, y compris la validation et les crochets. Juste quelque chose à garder à l'esprit.Model.create
perd les crochets, mais passe toujours par la validation. Si vous voulez tout, vous devez itérer etnew MyModel()
Mongoose 4.4.0 prend désormais en charge l'insertion en masse
Mongoose 4.4.0 introduit --true-- insertion en bloc avec la méthode model
.insertMany()
. C'est beaucoup plus rapide que de boucler.create()
ou de lui fournir un tableau.Usage:
Ou
Vous pouvez le suivre sur:
la source
bulkWrite
? Voir ici: stackoverflow.com/questions/38742475/…fatal error allocation failed
. Mais si j'utilise collection.insert Cela fonctionne parfaitement.dateCreated : { type: Date, default: Date.now },
En effet, vous pouvez utiliser la méthode "create" de Mongoose, elle peut contenir un tableau de documents, voir cet exemple:
La fonction de rappel contient les documents insérés. Vous ne savez pas toujours combien d'éléments doivent être insérés (longueur d'argument fixe comme ci-dessus) pour pouvoir les parcourir en boucle:
Mise à jour: une meilleure solution
Une meilleure solution serait d'utiliser
Candy.collection.insert()
au lieu deCandy.create()
- utilisé dans l'exemple ci-dessus - car c'est plus rapide (create()
appelleModel.save()
chaque élément donc il est plus lent).Consultez la documentation Mongo pour plus d'informations: http://docs.mongodb.org/manual/reference/method/db.collection.insert/
(merci à arcseldon pour l'avoir signalé)
la source
{type:'jellybean'}
au lieu de{type:'jelly bean'}
? Btw. de quels types étranges s'agit-il? Font-ils partie de l'API Mongoose?type
est généralement réservé dans Mongoose pour dénommer l'ADT d'un objet de base de données.Vous pouvez effectuer une insertion en bloc à l'aide du shell mongoDB en insérant les valeurs dans un tableau.
la source
YourModel.collection.insert()
collection.insert
réponse brute a été donnée quelques semaines avant cette réponse, et expliquée beaucoup plus en détail.Vous pouvez effectuer une insertion en masse en utilisant la mangouste, comme réponse avec le score le plus élevé. Mais l'exemple ne peut pas fonctionner, il devrait être:
N'utilisez pas d'instance de schéma pour l'insertion en bloc, vous devez utiliser un objet de carte simple.
la source
Voici les deux façons de sauvegarder des données avec insertMany et save
1) Mongoose enregistre un tableau de documents avec
insertMany
en vrac2) Mongoose enregistre un tableau de documents avec
.save()
Ces documents enregistreront en parallèle.
la source
Il semble que l'utilisation de la mangouste soit limitée à plus de 1000 documents, lors de l'utilisation
Vous pouvez utiliser:
Mais c'est presque deux fois plus rapide lors des tests avec 10000 documents:
la source
Partage du code fonctionnel et pertinent de notre projet:
la source
.insertMany
solution était déjà donnée (et expliquée) dans cette réponse de 2016 .