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