Selon le collection.copyTo()
documentation dans MongoDB 2.4, cet assistant shell "copie tous les documents de la collection dans newCollection en utilisant JavaScript côté serveur".
J'attends la raison pour laquelle vous obtenez un unauthorized
l'erreur est due au côté serveur db.eval()
commande
nécessite autorisations d'administrateur complètes
dans MongoDB 2.4 (plusieurs rôles sur le admin
base de données).
Vous pouvez en fait voir la source de cette aide dans le mongo
shell si vous invoquez copyTo()
sans le ()
:
> db.test.copyTo
function ( newName ){
return this.getDB().eval(
function( collName , newName ){
var from = db[collName];
var to = db[newName];
to.ensureIndex( { _id : 1 } );
var count = 0;
var cursor = from.find();
while ( cursor.hasNext() ){
var o = cursor.next();
count++;
to.save( o );
}
return count;
} , this.getName() , newName
);
}
En raison de l'utilisation de db.eval()
côté serveur , il existe plusieurs avertissements importants
sur copyTo()
utilisation, y compris les mises en garde sur la fidélité de type et les problèmes de verrouillage. Je pense que cet assistant est uniquement destiné à être utilisé dans des environnements de développement avec des autorisations plus ouvertes, plutôt que dans un environnement de production.
Copie DIY du mongo
coquille
Ce n'est pas une option complètement folle :). Voici un simple one-liner pour le mongo
shell (remplace source
et target
collections, le cas échéant) :
db.source.find().forEach( function(d) {db.target.insert(d)});
Si vous êtes préoccupé par la bande passante du réseau, vous pouvez l'exécuter à partir d'un mongo
shell qui est local sur votre serveur MongoDB.
Copier avec mongodump
/ mongorestore
Une meilleure approche pour copier une collection (mais pas directement depuis le mongo
shell) serait d'utiliser mongodump
&mongorestore
:
$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson