답변:
현재 MongoDB에는이 작업을 수행하는 명령이 없습니다. 관련 기능 요청이 있는 JIRA 티켓을 참고하십시오 .
당신은 다음과 같은 것을 할 수 있습니다 :
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
이를 통해 두 데이터베이스가 작동하려면 동일한 mongod를 공유해야합니다.
이 외에도 한 데이터베이스에서 컬렉션의 mongodump를 수행 한 다음 컬렉션을 다른 데이터베이스로 mongorestore 할 수 있습니다.
가장 좋은 방법은 mongodump를 수행 한 다음 mongorestore를 수행하는 것입니다.
다음을 통해 컬렉션을 선택할 수 있습니다.
mongodump -d some_database -c some_collection
[선택적으로 덤프를 압축하고 ( zip some_database.zip some_database/* -r
)scp
다른 곳을 ]
그런 다음 복원하십시오.
mongorestore -d some_other_db -c some_or_other_collection dump/some_collection.bson
기존 데이터 some_or_other_collection
보존됩니다. 이렇게하면 한 데이터베이스에서 다른 데이터베이스로 컬렉션을 "추가"할 수 있습니다.
버전 2.4.3 이전에는 데이터를 복사 한 후 색인을 다시 추가해야합니다. 2.4.3부터이 프로세스는 자동으로 수행되며을 사용하여 비활성화 할 수 있습니다 --noIndexRestore
.
사실, 거기에 있다 하는 명령 으로 이동 한 데이터베이스에서 다른 데이터베이스 모음. 그냥 "이동"또는 "복사"라고하지 않습니다.
컬렉션을 복사하려면 동일한 db에서 컬렉션을 복제 한 다음 복제본을 이동하십시오.
복제하려면
> use db1
> db.source_collection.find().forEach( function(x){db.collection_copy.insert(x)} );
이동:
> use admin
switched to db admin
> db.runCommand({renameCollection: 'db1.source_collection', to: 'db2.target_collection'}) // who'd think rename could move?
다른 답변은 컬렉션을 복사하는 것이 더 좋지만, 이동하려는 경우 특히 유용합니다.
'db1.source_collection'
mongo cli mongo doc 에서 연결 기능을 남용합니다 . 즉, 하나 이상의 연결을 시작할 수 있습니다. 동일한 서버에서 고객 콜렉션을 테스트에서 test2로 복사하려는 경우. 먼저 몽고 껍질을 시작합니다
use test
var db2 = connect('localhost:27017/test2')
정상적인 찾기를 수행하고 처음 20 개 레코드를 test2에 복사하십시오.
db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); });
또는 일부 기준으로 필터링
db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); });
localhost를 IP 또는 호스트 이름으로 변경하여 원격 서버에 연결하십시오. 테스트를 위해 테스트 데이터를 테스트 데이터베이스에 복사하는 데 사용합니다.
두 개의 원격 mongod 인스턴스 사이에
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
http://docs.mongodb.org/manual/reference/command/cloneCollection/을 참조 하십시오.
copyIndexes
옵션 필드는 실제로 존중하지 않는다. 인덱스는 항상 복사됩니다. SERVER-11418
대용량 컬렉션의 경우 Bulk.insert ()를 사용할 수 있습니다.
var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
bulk.insert(d);
});
bulk.execute();
이것은 많은 시간을 절약 할 것 입니다. 제 경우에는 1219 개의 문서가있는 컬렉션을 복사하고 있습니다 : iter vs bulk (67 초 vs 3 초)
나는이 질문에 대한 답을 알고 있지만 커서가 스트리밍되어 컬렉션이 계속 사용되는 경우 무한 커서 루프가 발생할 수 있기 때문에 개인적으로 @JasonMcCays 답변을하지 않을 것입니다. 대신 snapshot ()을 사용합니다.
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
@bens answer도 좋은 답변이며 컬렉션의 핫 백업뿐만 아니라 mongorestore는 동일한 mongod를 공유 할 필요가 없습니다.
pymongo를 사용하면 동일한 mongod에 두 데이터베이스가 모두 있어야합니다. 다음을 수행했습니다.
db = 원본 데이터베이스
db2 = 복사 할 데이터베이스
cursor = db["<collection to copy from>"].find()
for data in cursor:
db2["<new collection>"].insert(data)
이렇게하면 문제가 해결되지 않지만 mongodb 셸에는 copyTo
컬렉션을 동일한 데이터베이스의 다른 컬렉션으로 복사하는 방법이 있습니다 .
db.mycoll.copyTo('my_other_collection');
또한 JSON에 BSON에서, 그래서 변환 mongodump
/ mongorestore
다른 사람이 말했듯이, 갈 수있는 가장 좋은 방법입니다.
일부 heroku 사용자가 여기에서 걸려 넘어져서 스테이징 데이터베이스에서 프로덕션 데이터베이스로 또는 그 반대로 일부 데이터를 복사하려는 경우 여기에 매우 편리하게 수행하는 방법이 있습니다 (NB에는 오타가 없기를 바랍니다. 가능한 한 코드의 유효성을 확인하려고 시도합니다.)
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"
항상 Robomongo를 사용할 수 있습니다. v0.8.3부터는 콜렉션을 마우스 오른쪽 단추로 클릭하고 "데이터베이스에 콜렉션 복사"를 선택하여이를 수행 할 수있는 도구가 있습니다.
자세한 내용은 http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/을 참조하십시오.
이 기능은 버그 가 많기 때문에 0.8.5 에서 제거되었으므로 시험해 보려면 0.8.3 또는 0.8.4를 사용해야합니다.
데이터베이스, 컬렉션 또는 특정 컬렉션 다운로드 링크를 클릭하여 내보내기 및 가져 오기 도구가있는 "MongoDB 용 Studio3T"를 사용하십시오. https://studio3t.com/download/
이것은 Mongo의 db.copyDatabase
방법을 사용하여 수행 할 수 있습니다 .
db.copyDatabase(fromdb, todb, fromhost, username, password)
참조 : http://docs.mongodb.org/manual/reference/method/db.copyDatabase/