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