Podle collection.copyTo()
dokumentaci v MongoDB 2.4, tento pomocník shellu „zkopíruje všechny dokumenty z kolekce do newCollection pomocí JavaScriptu na straně serveru“.
Očekávám důvod, proč dostáváte unauthorized
chyba je, protože na straně serveru db.eval()
příkaz
vyžaduje úplná oprávnění správce
v MongoDB 2.4 (více rolí na admin
databáze).
Zdroj tohoto pomocníka můžete ve skutečnosti vidět v mongo
shell, pokud zavoláte copyTo()
bez ()
:
> 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
);
}
Kvůli použití db.eval()
na straně serveru , existuje několik významných varování
na copyTo()
použití včetně upozornění na věrnost typu a problémy se zamykáním. Věřím, že tento pomocník je určen pouze k použití ve vývojových prostředích s více otevřenými oprávněními, spíše než v produkčním prostředí.
Udělejte si kopii z mongo
shell
To není úplně šílená varianta :). Zde je jednoduchý jednoduchý řádek pro mongo
shell (nahraďte source
a target
sbírky podle potřeby):
db.source.find().forEach( function(d) {db.target.insert(d)});
Pokud máte obavy o šířku pásma sítě, můžete to spustit z mongo
shell, který je lokální na vašem serveru MongoDB.
Kopírujte pomocí mongodump
/ mongorestore
Lepší přístup ke kopírování kolekce (i když ne přímo z mongo
shell) by bylo použít mongodump
&mongorestore
:
$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson