Според 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