Enligt collection.copyTo()
dokumentation i MongoDB 2.4, denna skalhjälpare "kopierar alla dokument från samling till newCollection med hjälp av JavaScript på serversidan".
Jag förväntar mig anledningen till att du får en obehörig
felet beror på att serversidan db.eval( ) kommando
kräver fullständiga administratörsbehörigheter
i MongoDB 2.4 (flera roller på admin
databas).
Du kan faktiskt se källan till denna hjälpreda i mongo
skal om du anropar copyTo()
utan ()
:
> 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 av användningen av db.eval()
på serversidan , det finns flera betydande varningar
på copyTo()
användning inklusive varningar om typtrohet och låsningsproblem. Jag tror att den här hjälparen endast är avsedd att användas i utvecklingsmiljöer med mer öppna behörigheter, snarare än en produktionsmiljö.
Gör-det-själv-kopia från mongo
skal
Det är inte ett helt galet alternativ :). Här är en enkel one-liner för mongo
skal (ersätt källa
och mål
samlingar efter behov):
db.source.find().forEach( function(d) {db.target.insert(d)});
Om du är orolig för nätverkets bandbredd kan du köra detta från en mongo
skal som är lokalt för din MongoDB-server.
Kopiera med mongodump
/ mongorestore
Ett bättre sätt att kopiera en samling (men inte direkt från mongo
). shell) skulle vara att använda mongodump
&mongorestore
:
$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson