web-dev-qa-db-fra.com

Tronquer une collection

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.

47
iefpw

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é:

  • WiredTiger (moteur de stockage par défaut dans MongoDB 3.2 ou version ultérieure) libérera l'espace utilisé par une collection supprimée (et tous les index associés) une fois celle-ci terminée.
  • MMAPv1 (moteur de stockage par défaut dans MongoDB 3.0 et versions antérieures) permettra non de libérer de l'espace disque préalloué . Cela peut convenir à votre cas d'utilisation. l'espace libre est disponible pour être réutilisé lorsque de nouvelles données sont insérées.

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);
})
33
Stennie

Pour tronquer une collection et conserver les index, utilisez

 db.<collection>.remove({})
55
astroanu

la requête ci-dessous supprimera tous les enregistrements d'une collection et la conservera telle quelle,

db.collectionname.remove({})
7
IAmHomes

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.

2
Alon

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.

2
vinipsmaker

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().

0
Congwu Zhang

(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.

0
anil