Theo collection.copyTo()
trong MongoDB 2.4, trình trợ giúp trình bao này "sao chép tất cả tài liệu từ bộ sưu tập vào newCollection bằng JavaScript phía máy chủ".
Tôi cho rằng lý do bạn nhận được unauthorized
lỗi là do db.eval()
lệnh
yêu cầu toàn quyền quản trị viên
trong MongoDB 2.4 (nhiều vai trò trên admin
cơ sở dữ liệu).
Bạn thực sự có thể thấy nguồn của trình trợ giúp này trong mongo
shell nếu bạn gọi copyTo()
không có ()
:
> 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
);
}
Do việc sử dụng db.eval()
phía máy chủ , có một số cảnh báo quan trọng
trên copyTo()
việc sử dụng bao gồm các cảnh báo về độ trung thực của loại và các vấn đề về khóa. Tôi tin rằng trình trợ giúp này chỉ nhằm mục đích sử dụng trong môi trường phát triển với nhiều quyền mở hơn, thay vì môi trường sản xuất.
Bản sao tự làm từ mongo
vỏ
Đó không phải là một lựa chọn hoàn toàn điên rồ :). Đây là một lớp lót đơn giản cho mongo
shell (thay thế source
và target
bộ sưu tập nếu thích hợp):
db.source.find().forEach( function(d) {db.target.insert(d)});
Nếu bạn lo lắng về băng thông mạng, bạn có thể chạy nó từ mongo
shell cục bộ với máy chủ MongoDB của bạn.
Sao chép bằng mongodump
/ mongorestore
Một cách tiếp cận tốt hơn để sao chép một bộ sưu tập (mặc dù không phải trực tiếp từ mongo
shell) sẽ sử dụng mongodump
&mongorestore
:
$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson