Comment tronquer une collection dans MongoDB ou existe-t-il une telle chose?
Pour le moment, je dois supprimer 6 grandes collections en même temps et j'arrête le serveur, supprime les fichiers de base de données, puis je recrée la base de données et les collections qu'il contient. Existe-t-il un moyen de supprimer les données et de laisser la collection telle quelle? L'opération de suppression prend très longtemps. J'ai des millions d'entrées dans les collections.
Vous pouvez supprimer efficacement toutes les données et tous les index d'une collection avec db.collection.drop()
. Supprimer une collection contenant un grand nombre de documents et/ou d’index sera nettement plus efficace que de supprimer tous les documents à l’aide de db.collection.remove({})
. La méthode remove()
effectue la maintenance supplémentaire des index de mise à jour à mesure que les documents sont supprimés et serait encore plus lente dans un environnement de jeu de réplicas où le journal des opérations inclurait des entrées pour chaque document supprimé plutôt qu'une seule commande de suppression de collection.
Exemple utilisant le shell mongo
:
var dbName = 'nukeme';
db.getSiblingDB(dbName).getCollectionNames().forEach(function(collName) {
// Drop all collections except system ones (indexes/profile)
if (!collName.startsWith("system.")) {
// Safety hat
print("WARNING: going to drop ["+dbName+"."+collName+"] in 5s .. hit Ctrl-C if you've changed your mind!");
sleep(5000);
db[collName].drop();
}
})
Il est à noter que le fait de supprimer une collection a des résultats différents sur l'utilisation du stockage en fonction du moteur de stockage configuré:
Si vous supprimez plutôt la base de données, vous n'avez généralement pas besoin de créer explicitement les collections, car elles seront créées au fur et à mesure que les documents sont insérés.
Cependant, voici un exemple de suppression et de recréation de la base de données avec les mêmes noms de collection dans le shell mongo
:
var dbName = 'nukeme';
// Save the old collection names before dropping the DB
var oldNames = db.getSiblingDB(dbName).getCollectionNames();
// Safety hat
print("WARNING: going to drop ["+dbName+"] in 5s .. hit Ctrl-C if you've changed your mind!")
sleep(5000)
db.getSiblingDB(dbName).dropDatabase();
// Recreate database with the same collection names
oldNames.forEach(function(collName) {
db.getSiblingDB(dbName).createCollection(collName);
})
Pour tronquer une collection et conserver les index, utilisez
db.<collection>.remove({})
la requête ci-dessous supprimera tous les enregistrements d'une collection et la conservera telle quelle,
db.collectionname.remove({})
Il n'y a pas d'équivalent à l'opération "tronquer" dans MongoDB. Vous pouvez supprimer tous les documents, mais la complexité sera O (n) ou supprimer la collection. La complexité sera alors O(1) mais vous perdrez vos index.
Créez la base de données et les collections, puis sauvegardez la base de données sur des fichiers bson à l'aide de mongodump:
mongodump --db database-to-use
Ensuite, lorsque vous devez supprimer la base de données et recréer l’environnement précédent, utilisez simplement mongorestore:
mongorestore --drop
La sauvegarde sera sauvegardée dans le répertoire de travail actuel, dans un dossier nommé dump, lorsque vous utiliserez la commande mongodump.
La méthode db.drop()
obtient un verrou en écriture sur la base de données affectée et bloquera les autres opérations jusqu'à la fin.
Je pense que l’utilisation de la méthode db.remove({})
est préférable à db.drop()
.
(seulement info)
Si vous avez besoin de le faire dans Laravel nous pouvons utiliser ceci
ModelName::truncate();
En outre, nous pouvons utiliser le Mongo Compass (interface graphique pour mongo), un excellent outil que nous pouvons facilement comprendre pour ce type d'opération.