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