2012-01-19 36 views
45

Tôi muốn sao chép một bộ sưu tập MongoDB và lưu nó trên cùng một máy chủ với một tên khác. Vì vậy, ví dụ ngay bây giờ tôi có các bộ sưu tập sau đây: demo1.categories, demo1.users và demo2.users.Sao chép một bộ sưu tập trong MongoDB

Tôi muốn có một "demo2.categories" giống hệt với "demo1.categories". (Nó chỉ có một cái tên khác nhau.)

Trả lời

76

Tuy nhiên, một lần nữa các MongoDB documentation comes to the rescue

giả định rằng bộ sưu tập thực sự được đặt tên "demo1.categories":

db.demo1.categories.find().forEach(function(x){db.demo2.categories.insert(x)}); 
+2

ngọt ngào, làm việc như một nét duyên dáng may mắn! thanks :) – Daryna

+53

Tính đến 2.1+ bạn có thể làm db.demo1.copyTo ("demo2"); –

+12

'copyTo' chặn tất cả các hoạt động khác trong trường hợp mongod – r92

2

có đã có một lệnh cho việc này.

Sao chép một bộ sưu tập từ máy chủ này sang máy chủ khác. http://www.mongodb.org/display/DOCS/cloneCollection+Command

+7

Bạn đúng là lệnh này sẽ cho phép bạn sao chép từ máy chủ này sang máy chủ khác. Tuy nhiên, câu hỏi ban đầu đề cập đến cùng một máy chủ. Như tài liệu chỉ ra, bạn sẽ mất bộ sưu tập nếu bạn cố gắng sử dụng lệnh cloneCollection cho mục tiêu của câu hỏi gốc –

-2

Trong bảng điều khiển mongo, bạn cũng có thể làm như sau, trong đó db_host là máy nơi db_host có db với bộ sưu tập mà bạn muốn sao chép.

sử dụng db.cloneCollection (,)

+0

Rất tiếc, có một số vấn đề về định dạng, nên sử dụng db_name rồi db.cloneCollection (collection_name, db_host) –

+1

và ngược lại db_host và tên bộ sưu tập tức là db.cloneCollection (máy chủ, bộ sưu tập) –

+0

không hoạt động: {"ok": 0, "errmsg": "không thể cloneCollection từ bản thân"} –

28

Các & cách đơn giản nhất hiệu quả là sử dụng copyTo(), vì vậy bạn có thể sử dụng:

db.source.copyTo("target"); 

& nếu "target" không tồn tại, nó sẽ được đã tạo

- Cập nhật -

Theo CopyTo Documentation, Vì copyTo() sử dụng eval nội bộ, hoạt động sao chép sẽ chặn tất cả các hoạt động khác trên cá thể mongod. Vì vậy, nó không nên được sử dụng trên môi trường sản xuất.

- Cập nhật -

CopyTo() sử dụng eval() nội & eval() bị phản đối kể từ phiên bản 3.0, vì vậy CopyTo() cũng bị phản đối kể từ phiên bản 3.0.

+2

Không chạy copyTo trên hệ thống sản xuất. Như đã đề cập trong một bình luận cho câu trả lời được chấp nhận, nó sẽ chặn các hoạt động khác trên cá thể mongod của bạn một cách hiệu quả làm cho nó không có sẵn trong thời gian. –

+0

@ JamesWahlin cảm ơn ghi chú, tôi đã cập nhật câu trả lời, vì vậy mọi người có thể dễ dàng xem được – AbdelHady

+0

'cloneCollectionAsCapped' cũng chặn các hoạt động khác. Tôi phát hiện ra nó theo kinh nghiệm ... – Emer

18

Đây là cách nhanh nhất để sao chép bộ sưu tập của bạn:

mongoexport -d db_name -c src_collection | mongoimport -d db_name -c dst_collection --drop 

nó sẽ sao chép src_collection trong db_name để dst_collection.Hoặc bạn có thể làm điều đó trong hai bước trên mức bson:

mongodump -d db_name -c src_collection 
mongorestore --drop -d db_name -c dst_collection ./dump/db_name/src_collection.bson 
+2

Bạn thực sự tiết kiệm trong ngày của tôi. Đây là cách dễ nhất để làm điều đó: D Cảm ơn! – cgajardo

+3

Cách này không chỉ đơn giản nhất, mà còn đảm bảo cho bạn 100% danh tính ở mức nhị phân, nhưng tìm() và chèn() cách không. Ví dụ, nó chuyển đổi tất cả các bản ghi số nguyên của bạn thành số, vv – Tutankhamen

+0

đẹp và sạch +1 –

2

Nếu bạn lo ngại về tốc độ sau đó tôi phát hiện ra rằng bằng cách sử dụng aggregate với $project$out là một 100 lần nhanh hơn, không chắc chắn nếu có những hạn chế Mặc dù vậy, nhưng bạn sẽ phải tạo ra một tập hợp các lĩnh vực mà bạn muốn sao chép Ví dụ:

// Set of fields in the categories collection var setOfFields = {field1:1, field2:1.......} db.demo1.categories.aggregate([{ "$project": setOfFields},{ $out: "demo2.categories"}]);

này bản (dự án) tập chọn lĩnh vực cho tất cả các tài liệu demo1.categories-demo2.categories

11

Các tùy chọn nhanh nhất là

db.myoriginal.aggregate([ { $out: "mycopy" } ]) 
+0

Tôi đang sử dụng https://github.com/caolan/async trong ứng dụng node.js của tôi và điều này không hoạt động đối với mongodb Trình điều khiển node.js - Tôi hiện đang sử dụng giải pháp 'find(). forEach (....)' - vẫn upvoted vì nó hoạt động trong giao diện điều khiển –

Các vấn đề liên quan