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