De acordo com o
collection.copyTo()
documentação no MongoDB 2.4, este shell helper "copia todos os documentos da coleção em newCollection usando JavaScript do lado do servidor". Espero que o motivo pelo qual você está recebendo um
unauthorized
erro é porque o lado do servidor db.eval()
comando
requer permissões totais de administrador
no MongoDB 2.4 (várias funções no admin
base de dados). Você pode realmente ver a fonte deste auxiliar no
mongo
shell se você invocar copyTo()
sem o ()
:> 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
);
}
Devido ao uso de
db.eval()
do lado do servidor , existem vários avisos significativos
em copyTo()
uso, incluindo cuidados sobre fidelidade de tipo e problemas de bloqueio. Acredito que este auxiliar destina-se apenas a ser usado em ambientes de desenvolvimento com permissões mais abertas, em vez de um ambiente de produção. Cópia DIY do mongo
casca
Essa não é uma opção totalmente louca :). Aqui está uma linha simples para o
mongo
shell (substitua source
e target
coleções conforme apropriado):db.source.find().forEach( function(d) {db.target.insert(d)});
Se você está preocupado com a largura de banda da rede, você pode executá-lo em um
mongo
shell que é local para seu servidor MongoDB. Copiar com mongodump
/ mongorestore
Uma abordagem melhor para copiar uma coleção (embora não diretamente do
mongo
shell) seria usar mongodump
&mongorestore
:$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson