Có một cách đơn giản để làm điều này?
Có một cách đơn giản để làm điều này?
Câu trả lời:
Hiện tại không có lệnh nào trong MongoDB sẽ làm điều này. Xin lưu ý vé JIRA với yêu cầu tính năng liên quan .
Bạn có thể làm một cái gì đó như:
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
Xin lưu ý rằng với điều này, hai cơ sở dữ liệu sẽ cần chia sẻ cùng một mongod để điều này hoạt động.
Bên cạnh đó, bạn có thể thực hiện một bộ sưu tập của một bộ sưu tập từ một cơ sở dữ liệu và sau đó chuyển tiếp bộ sưu tập sang cơ sở dữ liệu khác.
Cách tốt nhất là thực hiện một mongodump sau đó mongorestore.
Bạn có thể chọn bộ sưu tập qua:
mongodump -d some_database -c some_collection
[Tùy chọn, nén zip ( zip some_database.zip some_database/* -r
) và scp
nó ở nơi khác]
Sau đó khôi phục nó:
mongorestore -d some_other_db -c some_or_other_collection dump/some_collection.bson
Dữ liệu hiện có trong some_or_other_collection
sẽ được bảo tồn. Bằng cách đó bạn có thể "nối" một bộ sưu tập từ cơ sở dữ liệu này sang cơ sở dữ liệu khác.
Trước phiên bản 2.4.3, bạn cũng sẽ cần thêm lại các chỉ mục của mình sau khi bạn sao chép dữ liệu của mình. Bắt đầu với 2.4.3, quá trình này là tự động và bạn có thể vô hiệu hóa nó với --noIndexRestore
.
Trên thực tế, có là một lệnh để di chuyển một bộ sưu tập từ một cơ sở dữ liệu khác. Nó chỉ không được gọi là "di chuyển" hoặc "sao chép".
Để sao chép một bộ sưu tập, bạn có thể sao chép nó trên cùng một db, sau đó di chuyển bản sao.
Để nhân bản:
> use db1
> db.source_collection.find().forEach( function(x){db.collection_copy.insert(x)} );
Để di chuyển:
> use admin
switched to db admin
> db.runCommand({renameCollection: 'db1.source_collection', to: 'db2.target_collection'}) // who'd think rename could move?
Các câu trả lời khác là tốt hơn để sao chép bộ sưu tập, nhưng điều này đặc biệt hữu ích nếu bạn đang muốn di chuyển nó.
'db1.source_collection'
Tôi sẽ lạm dụng chức năng kết nối trong mongo cli mongo doc . vì vậy điều đó có nghĩa là bạn có thể bắt đầu một hoặc nhiều kết nối. nếu bạn muốn sao chép bộ sưu tập của khách hàng từ test sang test2 trong cùng một máy chủ. đầu tiên bạn bắt đầu vỏ mongo
use test
var db2 = connect('localhost:27017/test2')
thực hiện tìm kiếm bình thường và sao chép 20 bản ghi đầu tiên vào test2.
db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); });
hoặc lọc theo một số tiêu chí
db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); });
chỉ cần thay đổi localhost thành IP hoặc tên máy chủ để kết nối với máy chủ từ xa. Tôi sử dụng điều này để sao chép dữ liệu thử nghiệm vào cơ sở dữ liệu thử nghiệm để thử nghiệm.
Nếu giữa hai trường hợp mongod từ xa, sử dụng
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
Xem http://docs.mongodb.org/manual/reference/command/cloneCollection/
copyIndexes
tùy chọn thực sự không được tôn trọng. Các chỉ mục luôn được sao chép. Xem SERVER-11418
đối với các bộ sưu tập kích thước khổng lồ, bạn có thể sử dụng Bulk.insert ()
var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
bulk.insert(d);
});
bulk.execute();
Điều này sẽ tiết kiệm rất nhiều thời gian . Trong trường hợp của tôi, tôi đang sao chép bộ sưu tập với 1219 tài liệu: iter vs Bulk (67 giây so với 3 giây)
Bạn có thể sử dụng khung tổng hợp để giải quyết vấn đề của mình
db.oldCollection.aggregate([{$out : "newCollection"}])
Cần lưu ý rằng các chỉ mục từ oldCollection sẽ không được sao chép trong newCollection.
Tôi biết câu hỏi này đã được trả lời tuy nhiên cá nhân tôi sẽ không trả lời @JasonMcCays do luồng con trỏ và điều này có thể gây ra một vòng lặp con trỏ vô hạn nếu bộ sưu tập vẫn đang được sử dụng. Thay vào đó, tôi sẽ sử dụng một snapshot ():
http://www.mongodb.org/display/DOCS/How+to+do+Snapshiated+Queries+in+the+Mongo+Database
Câu trả lời @bens cũng là một câu trả lời hay và hoạt động tốt cho các bản sao lưu nóng của các bộ sưu tập không chỉ vậy mà mongorestore không cần phải chia sẻ cùng một mongod.
Đây có thể chỉ là một trường hợp đặc biệt, nhưng đối với bộ sưu tập 100k tài liệu với hai trường chuỗi ngẫu nhiên (độ dài là 15-20 ký tự), sử dụng mapreduce câm nhanh gần gấp đôi so với find-insert / copyTo:
db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" })
Sử dụng pymongo, bạn cần có cả hai cơ sở dữ liệu trên cùng một mongod, tôi đã làm như sau:
db = cơ sở dữ liệu gốc
db2 = cơ sở dữ liệu sẽ được sao chép vào
cursor = db["<collection to copy from>"].find()
for data in cursor:
db2["<new collection>"].insert(data)
Điều này sẽ không giải quyết được vấn đề của bạn nhưng shell mongodb có một copyTo
phương thức sao chép một bộ sưu tập vào một bộ khác trong cùng một cơ sở dữ liệu :
db.mycoll.copyTo('my_other_collection');
Nó cũng dịch từ BSON sang JSON, vì vậy mongodump
/ mongorestore
là cách tốt nhất để đi, như những người khác đã nói.
Nếu RAM không phải là vấn đề thì sử dụng insertMany
nhanh hơn forEach
vòng lặp.
var db1 = connect('<ip_1>:<port_1>/<db_name_1>')
var db2 = connect('<ip_2>:<port_2>/<db_name_2>')
var _list = db1.getCollection('collection_to_copy_from').find({})
db2.collection_to_copy_to.insertMany(_list.toArray())
Trong trường hợp một số người dùng heroku vấp ngã ở đây và như tôi muốn sao chép một số dữ liệu từ cơ sở dữ liệu dàn dựng sang cơ sở dữ liệu sản xuất hoặc ngược lại đây là cách bạn làm điều đó rất thuận tiện (NB Tôi hy vọng không có lỗi chính tả nào trong đó, không thể kiểm tra nó. Tôi sẽ thử xác nhận tính hợp lệ của mã càng sớm càng tốt):
to_app="The name of the app you want to migrate data to"
from_app="The name of the app you want to migrate data from"
collection="the collection you want to copy"
mongohq_url=`heroku config:get --app "$to_app" MONGOHQ_URL`
parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__" | sed "s_[@/]_ _g"`)
to_token=${parts[0]}; to_url=${parts[1]}; to_db=${parts[2]}
mongohq_url=`heroku config:get --app "$from_app" MONGOHQ_URL`
parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__" | sed "s_[@/]_ _g"`)
from_token=${parts[0]}; from_url=${parts[1]}; from_db=${parts[2]}
mongodump -h "$from_url" -u heroku -d "$from_db" -p"$from_token" -c "$collection" -o col_dump
mongorestore -h "$prod_url" -u heroku -d "$to_app" -p"$to_token" --dir col_dump/"$col_dump"/$collection".bson -c "$collection"
Bạn luôn có thể sử dụng Robomongo. Kể từ v0.8.3, có một công cụ có thể thực hiện việc này bằng cách nhấp chuột phải vào bộ sưu tập và chọn "Sao chép bộ sưu tập vào cơ sở dữ liệu"
Để biết chi tiết, xem http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/
Tính năng này đã bị xóa trong 0.8.5 do tính chất lỗi của nó, do đó bạn sẽ phải sử dụng 0.8.3 hoặc 0.8.4 nếu bạn muốn dùng thử.
Trong trường hợp của tôi, tôi đã phải sử dụng một tập hợp các thuộc tính từ bộ sưu tập cũ trong bộ sưu tập mới của tôi. Vì vậy, tôi đã kết thúc việc chọn các thuộc tính đó trong khi gọi chèn vào bộ sưu tập mới.
db.<sourceColl>.find().forEach(function(doc) {
db.<newColl>.insert({
"new_field1":doc.field1,
"new_field2":doc.field2,
....
})
});`
sử dụng "Studio3T cho MongoDB" có công cụ Xuất và Nhập bằng cách nhấp vào cơ sở dữ liệu, bộ sưu tập hoặc liên kết tải xuống bộ sưu tập cụ thể: https://studio3t.com/doad/
Điều này có thể được thực hiện bằng db.copyDatabase
phương pháp của Mongo :
db.copyDatabase(fromdb, todb, fromhost, username, password)
Tham khảo: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/