Според collection.copyTo()
документация в MongoDB 2.4, този помощник на обвивката „копира всички документи от колекцията в newCollection, използвайки JavaScript от страна на сървъра“.
Очаквам причината да получите unauthorized грешката е, защото db.eval() команда
изисква пълни администраторски разрешения
в MongoDB 2.4 (множество роли на admin база данни).
Всъщност можете да видите източника за този помощник в mongo обвивка, ако извикате copyTo() без () :
> 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
);
}
Поради използването на db.eval() от страната на сървъра , има няколко важни предупреждения
на copyTo() използване, включително предупреждения относно прецизността на типа и проблеми със заключването. Вярвам, че този помощник е предназначен да се използва само в среди за разработка с по-отворени разрешения, а не в производствена среда.
Направи си сам копие от mongo обвивка
Това не е напълно луд вариант :). Ето прост един ред за mongo обвивка (заменете source и target колекции според случая):
db.source.find().forEach( function(d) {db.target.insert(d)});
Ако сте загрижени за честотната лента на мрежата, можете да стартирате това от mongo обвивка, която е локална за вашия MongoDB сървър.
Копирайте с mongodump / mongorestore
По-добър подход за копиране на колекция (макар и не директно от mongo shell) би било да се използва mongodump &mongorestore :
$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson