Il y a une faute de frappe dans le nom de ma base de données MongoDB et je souhaite renommer la base de données.
Je peux copier et supprimer comme si ...
db.copyDatabase('old_name', 'new_name');
use old_name
db.dropDatabase();
Existe-t-il une commande pour renommer une base de données?
Non il n'y en a pas. Voir https://jira.mongodb.org/browse/SERVER-701
Malheureusement, cette fonctionnalité n'est pas simple à mettre en œuvre en raison de la manière dont les métadonnées de la base de données sont stockées dans le moteur de stockage d'origine (par défaut). Dans les fichiers MMAPv1, l’espace de nom (par exemple: dbName.collection) qui décrit chaque collection et chaque index inclut le nom de la base de données. Par conséquent, pour renommer un ensemble de fichiers de base de données, chaque chaîne d’espace de nom doit être réécrite. Cela impacte:
- le fichier .ns
- chaque fichier numéroté pour la collection
- l'espace de noms pour chaque index
- noms uniques internes de chaque collection et index
- contenu de system.namespaces et de system.indexes (ou de leurs équivalents dans le futur)
- d'autres endroits peuvent me manquer
Cela consiste simplement à renommer une base de données unique dans une instance autonome autonome. Pour les ensembles de répliques, il est nécessaire d'effectuer la procédure ci-dessus sur chaque nœud de réplica, ainsi que sur chaque nœud chaque entrée d'oplog faisant référence à cette base de données. Cette base de données doit être invalidée ou réécrite. S'il s'agit d'un cluster fragmenté, vous devez également les ajouter. les modifications apportées à chaque fragment si la base de données est partagée, plus les serveurs de configuration ont toutes les métadonnées de fragment en termes d'espaces de noms avec leurs noms complets.
Il n'y aurait absolument aucun moyen de faire cela sur un système en direct.
Pour le faire en mode hors connexion, il faudrait réécrire chaque fichier de base de données afin de l'adapter au nouveau nom. À ce stade, il serait aussi lent que la commande "copydb" en cours ...
Vous pourriez faire ceci:
db.copyDatabase("db_to_rename","db_renamed","localhost")
use db_to_rename
db.dropDatabase();
Note de la rédaction: c’est la même approche que celle utilisée dans la question elle-même, mais elle s’est révélée utile aux autres.
Solution alternative: vous pouvez vider votre base de données et la restaurer sous un nom différent. Comme je l'ai constaté, c'est beaucoup plus rapide que db.copyDatabase()
.
$ mongodump -d old_db_name -o mongodump/
$ mongorestore -d new_db_name mongodump/old_db_name
http://docs.mongodb.org/manual/tutorial/backup-with-mongodump/
ALERT: Salut, faites attention lorsque vous copiez la base de données, si vous ne voulez pas gâcher les différentes collections sous une seule base de données.
Ce qui suit vous montre comment renommer
> show dbs;
testing
games
movies
Pour renommer vous utilisez la syntaxe suivante
db.copyDatabase("old db name","new db name")
Exemple:
db.copyDatabase('testing','newTesting')
Maintenant, vous pouvez supprimer en toute sécurité l'ancienne base de données de la manière suivante
use testing;
db.dropDatabase(); //Here the db **testing** is deleted successfully
Maintenant, imaginez ce qui se passe si vous essayez de renommer le nouveau nom de la base de données avec le nom de la base de données existante
Exemple:
db.copyDatabase('testing','movies');
Donc, dans ce contexte, toutes les collections (tables) de testing seront copiées dans la base de données films.
Le processus ci-dessus est lent, vous pouvez utiliser la méthode ci-dessous mais vous devez déplacer collection par collection vers une autre base de données.
use admin
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})
Bien que Mongodb ne fournisse pas la commande rename Database, il fournit la commande r ename Collection , qui modifie non seulement le nom de la collection, mais également le nom de la base de données.
db.adminCommand({renameCollection: "db1.test1", to: "db2.test2"})
Cette commande ne modifie que les métadonnées, le coût est très faible, il suffit de parcourir toutes les collections sous db1
, renommé db2
pour renommer le nom de la base de données.
vous pouvez le faire dans ce script Js
var source = "source";
var dest = "dest";
var colls = db.getSiblingDB(source).getCollectionNames();
for (var i = 0; i < colls.length; i++) {
var from = source + "." + colls[i];
var to = dest + "." + colls[i];
db.adminCommand({renameCollection: from, to: to});
}
Si vous mettez toutes vos données dans la base de données d'administration (vous ne devriez pas le faire), vous remarquerez que db.copyDatabase()
ne fonctionnera pas car votre utilisateur a besoin de nombreux privilèges que vous ne voudrez probablement pas lui attribuer. Voici un script pour copier la base de données manuellement:
use old_db
db.getCollectionNames().forEach(function(collName) {
db[collName].find().forEach(function(d){
db.getSiblingDB('new_db')[collName].insert(d);
})
});