Według collection.copyTo()
dokumentacji w MongoDB 2.4, ten helper powłoki "kopiuje wszystkie dokumenty z kolekcji do newCollection przy użyciu JavaScript po stronie serwera".
Spodziewam się powodu, dla którego otrzymujesz unauthorized błąd jest spowodowany tym, że po stronie serwera db.eval() polecenie
wymaga pełnych uprawnień administratora
w MongoDB 2.4 (wiele ról po stronie admin bazy danych).
Możesz zobaczyć źródło tego pomocnika w mongo powłoki, jeśli wywołasz 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
);
}
Ze względu na użycie po stronie serwera db.eval() , istnieje kilka istotnych ostrzeżeń
na copyTo() użycie, w tym ostrzeżenia dotyczące wierności typów i problemów z blokowaniem. Uważam, że ten pomocnik jest przeznaczony do użytku tylko w środowiskach programistycznych z bardziej otwartymi uprawnieniami, a nie w środowisku produkcyjnym.
Zrób to sam kopia z mongo powłoka
To nie jest całkowicie szalona opcja :). Oto prosty jeden wiersz dla mongo powłoka (zastąp source i target kolekcje odpowiednio):
db.source.find().forEach( function(d) {db.target.insert(d)});
Jeśli martwisz się o przepustowość sieci, możesz uruchomić to z mongo powłoki, która jest lokalna na serwerze MongoDB.
Kopiuj za pomocą mongodump / mongorestore
Lepsze podejście do kopiowania kolekcji (choć nie bezpośrednio z mongo powłoki) byłoby użycie mongodump &mongorestore :
$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson