Volgens de collection.copyTo()
documentatie in MongoDB 2.4, deze shell-helper "kopieert alle documenten van de verzameling naar newCollection met behulp van server-side JavaScript".
Ik verwacht de reden dat je een unauthorized . krijgt fout is omdat de server-side db.eval() commando
vereist volledige beheerdersrechten
in MongoDB 2.4 (meerdere rollen op de admin database).
Je kunt de bron voor deze helper zien in de mongo shell als u copyTo() . aanroept zonder de () :
> 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
);
}
Vanwege het gebruik van server-side db.eval() , zijn er verschillende belangrijke waarschuwingen
op copyTo() gebruik inclusief waarschuwingen over type-getrouwheid en vergrendelingsproblemen. Ik geloof dat deze helper alleen bedoeld is om te worden gebruikt in ontwikkelomgevingen met meer open rechten, in plaats van in een productieomgeving.
DIY-kopie van de mongo schelp
Dat is niet helemaal een gekke optie :). Hier is een simpele one-liner voor de mongo shell (vervang source en target collecties zoals van toepassing):
db.source.find().forEach( function(d) {db.target.insert(d)});
Als u zich zorgen maakt over de netwerkbandbreedte, kunt u dit uitvoeren vanaf een mongo shell die lokaal is op uw MongoDB-server.
Kopieer met mongodump / mongorestore
Een betere manier om een verzameling te kopiëren (hoewel niet rechtstreeks van de mongo shell) zou zijn om mongodump . te gebruiken &mongorestore :
$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson