Secondo collection.copyTo()
documentazione in MongoDB 2.4, questo helper della shell "copia tutti i documenti dalla raccolta in newCollection usando JavaScript lato server".
Mi aspetto il motivo per cui stai ricevendo un unauthorized
l'errore è dovuto al fatto che il lato server db.eval()
comando
richiede autorizzazioni di amministratore complete
in MongoDB 2.4 (ruoli multipli su admin
banca dati).
Puoi effettivamente vedere la fonte di questo helper nel mongo
shell se invochi copyTo()
senza il ()
:
> 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
);
}
A causa dell'uso di db.eval()
lato server , sono presenti diversi avvisi significativi
su copyTo()
utilizzo comprese le precauzioni sulla fedeltà del tipo e sui problemi di blocco. Ritengo che questo helper debba essere utilizzato solo in ambienti di sviluppo con autorizzazioni più aperte, piuttosto che in un ambiente di produzione.
Copia fai-da-te dal mongo
guscio
Non è un'opzione del tutto folle :). Ecco una semplice riga per il mongo
shell (sostituisci source
e target
raccolte a seconda dei casi):
db.source.find().forEach( function(d) {db.target.insert(d)});
Se sei preoccupato per la larghezza di banda della rete, puoi eseguirlo da un mongo
shell che è locale al tuo server MongoDB.
Copia con mongodump
/ mongorestore
Un approccio migliore alla copia di una raccolta (sebbene non direttamente da mongo
shell) sarebbe usare mongodump
&mongorestore
:
$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson