복붙노트

[MONGODB] MongoDB를 다른 하나의 데이터베이스에서 컬렉션을 복사하는 방법

MONGODB

MongoDB를 다른 하나의 데이터베이스에서 컬렉션을 복사하는 방법

이 작업을 수행 할 수있는 간단한 방법이 있나요?

해결법

  1. ==============================

    1.지금이 순간이 작업을 수행 할 것 MongoDB의에는 명령이 없습니다. 관련 기능 요청과 함께 JIRA 티켓을 유의하시기 바랍니다.

    지금이 순간이 작업을 수행 할 것 MongoDB의에는 명령이 없습니다. 관련 기능 요청과 함께 JIRA 티켓을 유의하시기 바랍니다.

    당신이 뭔가를 할 수 있습니다 :

    db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
    

    이것으로, 두 개의 데이터베이스 작업이 동일한 mongod를 공유 할 필요가 있습니다.

    이 외에도, 당신은 하나의 데이터베이스에서 모음의 mongodump을 할 수있는 다음 다른 데이터베이스에 수집을 mongorestore.

  2. ==============================

    2.가장 좋은 방법은 다음 mongorestore mongodump을하는 것입니다.

    가장 좋은 방법은 다음 mongorestore mongodump을하는 것입니다.

    당신은 컬렉션을 통해 선택할 수 있습니다 :

    mongodump -d some_database -c some_collection
    

    [임의로, 덤프 지퍼 (지퍼 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 기존 데이터를 보존한다. 그런 식으로 당신이 할 수있는 "APPEND"다른 하나의 데이터베이스에서 컬렉션.

    버전 2.4.3 이전에, 당신은 또한 당신이 당신의 데이터를 통해 복사 한 후 인덱스를 다시 추가해야합니다. 2.4.3부터이 과정은 자동으로, 당신은 --noIndexRestore으로 비활성화 할 수 있습니다.

  3. ==============================

    3.사실, 다른 하나의 데이터베이스에서 컬렉션을 이동하는 명령이 있습니다. 그냥 "이동"또는 "복사"라고 아닙니다.

    사실, 다른 하나의 데이터베이스에서 컬렉션을 이동하는 명령이 있습니다. 그냥 "이동"또는 "복사"라고 아닙니다.

    컬렉션을 복사하려면, 당신은 다음, 같은 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?
    

    다른 답변은 더 나은 컬렉션을 복사하는,하지만 당신이 이동하고자하는 경우에 특히 유용합니다.

  4. ==============================

    4.나는 몽고 CLI 몽고 문서의 연결 기능을 악용하는 것입니다. 그래서 수단은 하나 이상의 연결을 시작할 수 있습니다. 당신은 동일한 서버에 TEST2로 테스트에서 고객의 수집을 복사 할 경우. 먼저는 몽고 쉘을 시작

    나는 몽고 CLI 몽고 문서의 연결 기능을 악용하는 것입니다. 그래서 수단은 하나 이상의 연결을 시작할 수 있습니다. 당신은 동일한 서버에 TEST2로 테스트에서 고객의 수집을 복사 할 경우. 먼저는 몽고 쉘을 시작

    use test
    var db2 = connect('localhost:27017/test2')
    

    보통의 발견을하고 TEST2에 처음 20 기록을 복사합니다.

    db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); });
    

    어떤 기준에 의해 또는 필터

    db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); });
    

    단지 원격 서버에 연결 IP 또는 호스트 이름에 로컬 호스트를 변경합니다. 나는 테스트하기위한 테스트 데이터베이스에 테스트 데이터를 복사하려면이 옵션을 사용합니다.

  5. ==============================

    5.만약 사이에 두 개의 원격 mongod 인스턴스 사용

    만약 사이에 두 개의 원격 mongod 인스턴스 사용

    { cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> } 
    

    http://docs.mongodb.org/manual/reference/command/cloneCollection/ 참조

  6. ==============================

    6.나는 보통 할 것입니다 :

    나는 보통 할 것입니다 :

    use sourcedatabase;
    var docs=db.sourcetable.find();
    use targetdatabase;
    docs.forEach(function(doc) { db.targettable.insert(doc); });
    
  7. ==============================

    7.거대한 크기의 컬렉션을 위해, 당신은) (Bulk.insert을 사용할 수 있습니다

    거대한 크기의 컬렉션을 위해, 당신은) (Bulk.insert을 사용할 수 있습니다

    var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
    db.getCollection(sourceCollectionName).find().forEach(function (d) {
        bulk.insert(d);
    });
    bulk.execute();
    

    이것은 많은 시간을 절약 할 수 있습니다. 내 경우, 나는 1219 개 문서 모음을 복사 해요 : 대량 대 ITER (3 초 대 67 초)을

  8. ==============================

    8.이 질문 때문에 커서 스트리밍 및 컬렉션이 여전히 사용중인 경우이 무한 커서 루프가 발생할 수 있다는 사실을하지만 나는 개인적으로 @JasonMcCays 대답하지 않을 것이라고 대답했습니다 알고있다. 대신에 나는) (스냅 샷을 사용합니다 :

    이 질문 때문에 커서 스트리밍 및 컬렉션이 여전히 사용중인 경우이 무한 커서 루프가 발생할 수 있다는 사실을하지만 나는 개인적으로 @JasonMcCays 대답하지 않을 것이라고 대답했습니다 알고있다. 대신에 나는) (스냅 샷을 사용합니다 :

    http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database

    대답은 또한 좋은 하나이며 컬렉션의 핫 백업을 위해 잘 작동 @bens뿐만 아니라하지만 같은 mongod를 공유 할 mongorestore 필요하지 않습니다.

  9. ==============================

    9.이것은 단지 특별한 경우가 있지만, 바보 맵리 듀스를 사용하여 두 개의 임의의 문자열 필드 (길이가 15 ~ 20 개 문자이다)와 100,000 문서의 집합, 거의 두 배 빠른로 발견 - 삽입 / 사항 copyTo 수 있습니다

    이것은 단지 특별한 경우가 있지만, 바보 맵리 듀스를 사용하여 두 개의 임의의 문자열 필드 (길이가 15 ~ 20 개 문자이다)와 100,000 문서의 집합, 거의 두 배 빠른로 발견 - 삽입 / 사항 copyTo 수 있습니다

    db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" })
    
  10. ==============================

    10.당신은 당신의 문제를 해결하기 위해 통합 프레임 워크를 사용할 수 있습니다

    당신은 당신의 문제를 해결하기 위해 통합 프레임 워크를 사용할 수 있습니다

    db.oldCollection.aggregate([{$out : "newCollection"}])
    

    oldCollection에서 인덱스가 newCollection에 복사되지 않습니다 주목해야 말아야.

  11. ==============================

    11.같은 mongod에 두 데이터베이스를 가지고 pymongo를, 당신이 필요로 사용하여, 나는 다음과 같은했다 :

    같은 mongod에 두 데이터베이스를 가지고 pymongo를, 당신이 필요로 사용하여, 나는 다음과 같은했다 :

    DB는 원래 데이터베이스를 = DB2 = 데이터베이스에 복사 할

    cursor = db["<collection to copy from>"].find()
    for data in cursor:
        db2["<new collection>"].insert(data)
    
  12. ==============================

    12.이 문제가 해결되지 않습니다하지만 MongoDB의 쉘이하는 CopyTo 메서드가 사본이 동일한 데이터베이스에서 다른 하나로 모음 :

    이 문제가 해결되지 않습니다하지만 MongoDB의 쉘이하는 CopyTo 메서드가 사본이 동일한 데이터베이스에서 다른 하나로 모음 :

    db.mycoll.copyTo('my_other_collection');
    

    또한 다른 사람이 말했듯이 mongodump 있도록 /, 이동하는 가장 좋은 방법 mongorestore 있습니다, JSON에 BSON에서 변환합니다.

  13. ==============================

    13.RAM이 insertMany를 사용하여 문제가없는 경우 방법은 빠른 foreach 루프보다.

    RAM이 insertMany를 사용하여 문제가없는 경우 방법은 빠른 foreach 루프보다.

    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())
    
  14. ==============================

    14.경우 일부 Heroku가 사용자가 여기에 걸려 넘어 나를 프로덕션 데이터베이스 또는 그에 준비 데이터베이스에서 일부 데이터를 복사 할 같이 반대 여기 당신이 그것을 더 오타가 거기에 없다 매우 편리 (NB I 희망, 기압을 확인할 수 없습니다 할 방법은 다음과 같습니다., 나는) 최대한 빨리 코드의 유효성을 확인하려고합니다 :

    경우 일부 Heroku가 사용자가 여기에 걸려 넘어 나를 프로덕션 데이터베이스 또는 그에 준비 데이터베이스에서 일부 데이터를 복사 할 같이 반대 여기 당신이 그것을 더 오타가 거기에 없다 매우 편리 (NB I 희망, 기압을 확인할 수 없습니다 할 방법은 다음과 같습니다., 나는) 최대한 빨리 코드의 유효성을 확인하려고합니다 :

    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"
    
  15. ==============================

    15.당신은 항상 Robomongo를 사용할 수 있습니다. v0.8.3 기준으로 수집 및 "데이터베이스에 복사 컬렉션"을 선택 마우스 오른쪽 버튼으로 클릭하여이 작업을 수행 할 수있는 도구가

    당신은 항상 Robomongo를 사용할 수 있습니다. v0.8.3 기준으로 수집 및 "데이터베이스에 복사 컬렉션"을 선택 마우스 오른쪽 버튼으로 클릭하여이 작업을 수행 할 수있는 도구가

    자세한 내용은 http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/ 참조

    당신은 당신이 그것을 밖으로 시도하려는 경우 0.8.3 또는 0.8.4을 사용해야합니다 있도록이 기능은 인해 버그 특성 0.8.5에서 제거되었습니다.

  16. ==============================

    16.내 경우에는, 나는 나의 새로운 컬렉션 기존 컬렉션 속성의 부분 집합을 사용했다. 그래서 새 컬렉션에 삽입을 호출하는 동안 이러한 속성을 선택 끝났다.

    내 경우에는, 나는 나의 새로운 컬렉션 기존 컬렉션 속성의 부분 집합을 사용했다. 그래서 새 컬렉션에 삽입을 호출하는 동안 이러한 속성을 선택 끝났다.

    db.<sourceColl>.find().forEach(function(doc) { 
        db.<newColl>.insert({
            "new_field1":doc.field1,
            "new_field2":doc.field2,
            ....
        })
    });`
    
  17. ==============================

    17."MongoDB를위한 Studio3T"를 사용 데이터베이스, 컬렉션 또는 특정 컬렉션 클릭하여 내보내기 및 가져 오기 도구를 가지고 다운로드 링크 : https://studio3t.com/download/

    "MongoDB를위한 Studio3T"를 사용 데이터베이스, 컬렉션 또는 특정 컬렉션 클릭하여 내보내기 및 가져 오기 도구를 가지고 다운로드 링크 : https://studio3t.com/download/

  18. ==============================

    18.이 몽고의 db.copyDatabase 방법을 사용하여 수행 할 수 있습니다 :

    이 몽고의 db.copyDatabase 방법을 사용하여 수행 할 수 있습니다 :

    db.copyDatabase(fromdb, todb, fromhost, username, password)
    

    참조 : http://docs.mongodb.org/manual/reference/method/db.copyDatabase/

  19. from https://stackoverflow.com/questions/11554762/how-to-copy-a-collection-from-one-database-to-another-in-mongodb by cc-by-sa and MIT license