Per collection.copyTo()
Dokumentation in MongoDB 2.4, dieser Shell-Helfer "kopiert alle Dokumente aus der Sammlung in newCollection mit serverseitigem JavaScript".
Ich erwarte den Grund, warum Sie einen unauthorized
erhalten Fehler liegt daran, dass serverseitig db.eval()
Befehl
erfordert vollständige Administratorberechtigungen
in MongoDB 2.4 (mehrere Rollen im admin
Datenbank).
Sie können die Quelle für diesen Helfer tatsächlich im mongo
sehen Shell, wenn Sie copyTo()
aufrufen ohne ()
:
> 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
);
}
Aufgrund der serverseitigen Verwendung von db.eval()
, gibt es mehrere wichtige Warnungen
auf copyTo()
Verwendung, einschließlich Warnungen zur Typtreue und zu Sperrproblemen. Ich glaube, dass dieser Helfer nur für die Verwendung in Entwicklungsumgebungen mit offeneren Berechtigungen gedacht ist und nicht in einer Produktionsumgebung.
DIY-Kopie aus dem mongo
Schale
Das ist keine völlig verrückte Option :). Hier ist ein einfacher Einzeiler für den mongo
Shell (ersetzen Sie source
und target
Sammlungen wie zutreffend):
db.source.find().forEach( function(d) {db.target.insert(d)});
Wenn Sie sich Sorgen um die Netzwerkbandbreite machen, können Sie dies von einem mongo
ausführen Shell, die für Ihren MongoDB-Server lokal ist.
Mit mongodump
kopieren / mongorestore
Ein besserer Ansatz zum Kopieren einer Sammlung (wenn auch nicht direkt aus dem mongo
Shell) wäre die Verwendung von mongodump
&mongorestore
:
$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson