Ifølge collection.copyTo()
dokumentation i MongoDB 2.4, denne shell-hjælper "kopierer alle dokumenter fra samling til newCollection ved hjælp af server-side JavaScript".
Jeg forventer grunden til, at du får en uautoriseret fejlen skyldes, at serversiden db.eval( ) kommando
kræver fulde administratortilladelser
i MongoDB 2.4 (flere roller på admin database).
Du kan faktisk se kilden til denne hjælper i mongo shell, hvis du kalder copyTo() uden () :
> 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
);
}
På grund af brugen af db.eval() på serversiden , er der adskillige væsentlige advarsler
på copyTo() brug, herunder advarsler om typetroskab og låseproblemer. Jeg tror, at denne hjælper kun er beregnet til at blive brugt i udviklingsmiljøer med mere åbne tilladelser, snarere end et produktionsmiljø.
Gør-det-selv-kopi fra mongo skal
Det er ikke en helt tosset mulighed :). Her er en simpel one-liner til mongo shell (erstat kilde og mål samlinger efter behov):
db.source.find().forEach( function(d) {db.target.insert(d)});
Hvis du er bekymret for netværksbåndbredden, kan du køre dette fra en mongo shell, som er lokal for din MongoDB-server.
Kopiér med mongodump / mongorestore
En bedre tilgang til at kopiere en samling (dog ikke direkte fra mongo shell) ville være at bruge mongodump &mongorestore :
$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson