Según el collection.copyTo()
documentación en MongoDB 2.4, este asistente de shell "copia todos los documentos de la colección en newCollection usando JavaScript del lado del servidor".
Espero la razón por la que está recibiendo un unauthorized el error se debe a que el lado del servidor db.eval() comando
requiere permisos de administrador completos
en MongoDB 2.4 (múltiples roles en el admin base de datos).
De hecho, puede ver la fuente de este ayudante en mongo shell si invoca copyTo() sin el () :
> 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
);
}
Debido al uso de db.eval() del lado del servidor , hay varias advertencias importantes
en copyTo() uso, incluidas las precauciones sobre la fidelidad del tipo y los problemas de bloqueo. Creo que este asistente solo está diseñado para usarse en entornos de desarrollo con permisos más abiertos, en lugar de un entorno de producción.
Copia de bricolaje del mongo concha
Esa no es una opción completamente loca :). Aquí hay una sola línea para el mongo shell (reemplace source y target colecciones según corresponda):
db.source.find().forEach( function(d) {db.target.insert(d)});
Si le preocupa el ancho de banda de la red, puede ejecutarlo desde un mongo shell que es local para su servidor MongoDB.
Copiar con mongodump / mongorestore
Un mejor enfoque para copiar una colección (aunque no directamente desde mongo shell) sería usar mongodump &mongorestore :
$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson