Je prépare un script de création de base de données dans Node.js et Mongoose. Comment puis-je vérifier si la base de données existe déjà et si oui, la supprimer (la supprimer) à l'aide de Mongoose?
Je n'ai pas pu trouver un moyen de le laisser tomber avec Mongoose.
Réponses:
Il n'y a pas de méthode pour supprimer une collection de mangouste, le mieux que vous puissiez faire est d'en supprimer le contenu:
Mais il existe un moyen d'accéder au pilote javascript natif de mongodb, qui peut être utilisé pour cela
avertissement
Faites une sauvegarde avant d'essayer cela au cas où quelque chose ne va pas!
la source
Mongoose créera une base de données s'il n'en existe pas déjà une lors de la connexion, donc une fois la connexion établie, vous pouvez simplement l'interroger pour voir s'il contient quelque chose.
Vous pouvez supprimer toute base de données à laquelle vous êtes connecté:
la source
mongoose.connection.db.dropDatabase()
mais j'ai trouvé que la base de données est toujours là? Est-ce que je rate quelque chose?dropDatabase
invocation devait être placée dans le rappel deconnect
, commemongoose.connect('...', function() { ...dropDatabase()})
.mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function(err, result) { if (err) { console.log(err); } done(); });
Si vous modifiez la solution de @ hellslam de cette manière, cela fonctionnera
J'utilise cette technique pour supprimer la base de données après mes tests d'intégration
HTH au moins ça l'a fait pour moi, alors j'ai décidé de partager =)
la source
db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
mongoose.connect
retourne en faitmongoose
. Au lieu d'conn = mongoose.connect(...)
écriremongoose.connect(...)
et puisconn = mongooose.connection
.connect
est asynchrone. Donc, si la connexion ne se produit pas immédiatement, la commande dropDatabase () échouera. C'est pourquoi les autres solutions ci-dessus recommandaient de placer ladropDatabase
commande dans le rappel de l'connect
instruction ou d'unopen
gestionnaire d'événements.J'ai essayé les réponses de @ hellslam et @ silverfighter. J'ai trouvé une condition de course retenant mes tests. Dans mon cas, j'exécute des tests moka et dans la fonction avant du test, je veux effacer toute la base de données. Voici ce qui fonctionne pour moi.
Vous pouvez en savoir plus https://github.com/Automattic/mongoose/issues/1469
la source
Une réponse mise à jour, pour 4.6.0+, si vous avez une préférence pour les promesses ( voir la documentation ):
J'ai testé ce code dans mon propre code, en utilisant mongoose 4.13.6. Notez également l'utilisation de l'
useMongoClient
option ( voir la documentation ). Les documents indiquent:la source
La difficulté que j'ai rencontrée avec les autres solutions est qu'elles reposent sur le redémarrage de votre application si vous souhaitez que les index fonctionnent à nouveau.
Pour mes besoins (c'est-à-dire pouvoir exécuter un test unitaire sur toutes les collections d'armes nucléaires, puis les recréer avec leurs index), j'ai fini par implémenter cette solution:
Cela repose sur les bibliothèques underscore.js et async.js pour assembler les index en parallèle, cela pourrait être déroulé si vous êtes contre cette bibliothèque, mais je laisse cela comme un exercice pour le développeur.
la source
Pour vider une collection particulière dans une base de données:
Remarque:
la source
Cela fonctionne pour moi à partir de Mongoose
v4.7.0
:la source
La meilleure façon de déposer votre base de données dans Mongoose dépend de la version de Mongoose que vous utilisez. Si vous utilisez une version de Mongoose que 4.6.4 ou plus récente, alors cette méthode ajoutée dans cette version fonctionnera probablement bien pour vous:
Dans les versions plus anciennes, cette méthode n'existait pas. Au lieu de cela, vous deviez utiliser un appel MongoDB direct:
Cependant, si cela était exécuté juste après la création de la connexion à la base de données, il pourrait éventuellement échouer silencieusement. Ceci est lié au fait que la connexion est réellement asynchrone et n'est pas encore configurée lorsque la commande se produit. Ce n'est normalement pas un problème pour les autres appels Mongoose comme
.find()
, quelle file d'attente jusqu'à ce que la connexion soit ouverte, puis exécutée.Si vous regardez le code source du
dropDatabase()
raccourci qui a été ajouté, vous pouvez voir qu'il a été conçu pour résoudre exactement ce problème. Il vérifie si la connexion est ouverte et prête. Si tel est le cas, il déclenche la commande immédiatement. Sinon, il enregistre la commande à exécuter lorsque la connexion à la base de données est ouverte.Certaines des suggestions ci-dessus recommandent de toujours placer votre
dropDatabase
commande dans leopen
gestionnaire. Mais cela ne fonctionne que dans le cas où la connexion n'est pas encore ouverte.Voici une version simple de la logique ci-dessus qui peut être utilisée avec les versions antérieures de Mongoose:
la source
Mongoose 4.6.0+:
Passer un rappel pour se connecter ne fonctionnera plus:
TypeError: impossible de lire la propriété 'commandsTakeWriteConcern' de null
la source
connect
renvoie une promesse, vous pouvez donc ajouter.then((connection) => { ... });
aumongoose.connect
. Voir: mongoosejs.com/docs/connections.htmlla source
Puisque la méthode remove est dépréciée dans la bibliothèque mangouste, nous pouvons utiliser la fonction deleteMany sans aucun paramètre passé.
Cela supprimera tout le contenu de ce modèle particulier et votre collection sera vide.
la source
Pour déposer tous les documents d'une collection:
Cette réponse est basée sur le fichier mongoose index.d.ts:
la source
Pour déposer tous les documents d'une collection:
comme vu dans les tests
la source