programing

MongoDB에서 데이터베이스 간에 컬렉션을 복사하는 방법

subpage 2023. 3. 20. 23:13
반응형

MongoDB에서 데이터베이스 간에 컬렉션을 복사하는 방법

간단한 방법이 있을까요?

은 이렇게 예요.mongodumpmongorestore컬렉션은 다음 방법으로 선택할 수 있습니다.

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.

현재 MongoDB에는 이를 수행할 명령어가 없습니다.JIRA 티켓에 관련된 기능 요청을 적어두시기 바랍니다.

다음과 같은 작업을 수행할 수 있습니다.

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

이를 위해서는 두 데이터베이스가 동일한 mongod를 공유해야 합니다.

이 외에도 한 데이터베이스에서 컬렉션의 mongodump를 수행한 후 다른 데이터베이스에 컬렉션을 저장할 수 있습니다.

실제로 데이터베이스 간에 컬렉션을 이동하는 명령어가 있습니다.그냥 '이동'이나 '복사'라고 부르지 않습니다.

컬렉션을 복사하려면 동일한 데이터베이스에서 해당 컬렉션을 복제한 다음 복제된 컬렉션을 이동합니다.

복제 방법:

> use db1
switched to db 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'
      }
  );

다른 답변은 컬렉션을 복사하는 데 더 좋지만, 이 답변은 컬렉션을 이동하려는 경우에 특히 유용합니다.

mongo cli mongo doc의 connect 기능을 악용할 수 있으므로 1개 이상의 접속을 시작할 수 있습니다.같은 서버의 테스트에서 테스트2로 고객 컬렉션을 복사하는 경우먼저 당신은 mongo shell을 시작합니다.

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); });

로컬 호스트를 IP 또는 호스트 이름으로 변경하여 원격 서버에 연결하기만 하면 됩니다.테스트를 위해 테스트 데이터를 테스트 데이터베이스에 복사하기 위해 사용합니다.

2개의 리모트 mongod 인스턴스 사이에 있는 경우

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

http://docs.mongodb.org/manual/reference/command/cloneCollection/ 를 참조해 주세요.

저는 보통 다음과 같이 합니다.

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

대용량 컬렉션에는 Bulk.insert()사용할 수 있습니다.

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

이렇게 하면 시간이 많이 절약됩니다.제 경우, 1219개의 문서로 컬렉션을 복사하고 있습니다.반복사 대 벌크 (67초 대 3초)

한 장 한 장의 데이터 복사본이 고통스러울 정도로 느린데 대해 얼마나 많은 표를 얻을 수 있는지 믿을 수 없습니다.

가장 은 '보다 빨리 해결하다' 입니다.mongodump / mongorestore. 에 직접 할 수 덤프를 로컬 디스크에 저장할 필요가 없습니다.몽고레스토어

mongodump --db=some_database --collection=some_collection --archive=- | mongorestore --nsFrom="some_database.some_collection" --nsTo="some_or_other_database.some_or_other_collection" --archive=-

샤드된 클러스터를 실행하는 경우 새 컬렉션은 기본적으로 샤드되지 않습니다.모든 데이터는 처음에 프라이머리 샤드에 기록됩니다.이로 인해 디스크 공간에 문제가 발생하여 균형 조정을 위해 클러스터에 추가 부하가 걸릴 수 있습니다.데이터를 가져오기 전에 다음과 같이 컬렉션을 사전 분할하는 것이 좋습니다.

sh.shardCollection("same_or_other_database.same_or_other_collection", { <shard_key>: 1 });
db.getSiblingDB("config").getCollection("chunks").aggregate([
   { $match: { ns: "some_database.some_collection"} },
   { $sort: { min: 1 } },
   { $skip: 1 }
], { allowDiskUse: true }).forEach(function (chunk) {
   sh.splitAt("same_or_other_database.same_or_other_collection", chunk.min)
})

수집 복사를 수행하는 방법은 여러 가지가 있습니다.는 같은 또는 "Database", "Database", "Data" 및 "Data"에서 할 수 .mongod인턴 복사에 .일부 도구는 대규모 컬렉션 복사에 효율적입니다.

$merge를 사용한 집약:집계 파이프라인의 결과를 지정된 컬렉션에 씁니다.복사 작업은 데이터베이스 전체에서 수행될 수 있으며, 분할된 컬렉션에서도 수행될 수 있습니다.새 컬렉션을 만들거나 기존 컬렉션을 바꿉니다.버전 4.2의 새로운 기능예:db.test.aggregate([ { $merge: { db: "newdb", coll: "newcoll" }} ])

$out을 사용한 집계: 집계 파이프라인의 결과를 지정된 컬렉션에 씁니다.복사는 동일한 데이터베이스 내에서만 수행될 수 있습니다.새 컬렉션을 만들거나 기존 컬렉션을 바꿉니다.예:db.test.aggregate([ { $out: "newcoll" } ])

mongo export 및 mongo import:명령줄 도구입니다. mongoexportJSON의 CSV의 JSON입니다.은, 「 」, 「 」를해 행선지 됩니다.mongoimport.

mongodump 및 mongore store:명령줄 도구입니다. mongodump유틸리티는 데이터베이스 또는 컬렉션의 내용을 바이너리 내보내기로 작성하기 위한 것입니다.mongorestore은 "binary database dump"에 의해 합니다.mongodump목적지에 도달합니다.

db.cloneCollection(): 원격에서 컬렉션을 복사합니다.mongod " " " " " " 에 대한 mongod버전 42 이후 되었습니다.

db.collection.copyTo(): 컬렉션의 모든 문서를 (같은 데이터베이스 내의) 새로운 컬렉션으로 복사합니다.버전 3.0 이후 폐지되었습니다.버전 4.2 이후 MongoDB에서는 이 명령어는 유효하지 않습니다.

메모: 위의 명령어는 다음 명령어부터 실행됩니다.mongosnowledge를 선택합니다.

레퍼런스:MongoDB 매뉴얼

를 사용하고, 등)나NodeJ을카피를 할 수도 .이는 insert 하는 것을 할 수 .이것은 검색 및 삽입 조작이나 다른 방법을 사용하는 것을 수반하는 경우가 있습니다.는 Find-Insert에서 할 수 .mongo개껍껍조

MongoDB Compass와 같은 GUI 프로그램을 사용하여 컬렉션 복사를 할 수도 있습니다.

집약 프레임워크를 사용하여 문제를 해결할 수 있습니다.

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

oldCollection 인덱스는 newCollection에 복사되지 않습니다.

이 질문에 답한 것은 알지만, 개인적으로 @Jason McCays는 커서가 스트리밍되기 때문에 이 컬렉션을 계속 사용할 경우 무한 커서 루프가 발생할 수 있기 때문에 답변을 하지 않을 것입니다.대신 snapshot()을 사용합니다.

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

@bens의 답변은 좋은 답변으로 컬렉션의 핫백업뿐만 아니라 mongore store에서도 같은 mongod를 공유할 필요가 없습니다.

이것은 특별한 경우일 수도 있지만, 2개의 랜덤 문자열 필드(길이 15-20 문자)가 있는 10만 개의 문서 모음의 경우 dumb mapreduce를 사용하는 것이 find-insert/copy보다 거의 두 배 빠릅니다.수신인:

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

pymongo를 사용하여 두 데이터베이스를 같은 mongod에 저장해야 합니다.다음 작업을 수행했습니다.


db = 원본 데이터베이스
db2 = 복사할 데이터베이스

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

이 사용 시 않는 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())

이 방법으로는 문제가 해결되지 않지만 mongodb 쉘에는 컬렉션을 동일한 데이터베이스 내의 다른 컬렉션으로 복사하는 방법이 있습니다.

db.mycoll.copyTo('my_other_collection');

되므로 BSON은 JSON으로 변환됩니다.mongodump/mongorestore다른 사람들이 말했듯이 최선의 방법이야.

여기 정답이 많네요.나는 찬성할 것이다.mongodump ★★★★★★★★★★★★★★★★★」mongorestore많은 컬렉션을 위해 파이프로 연결되었습니다.

mongodump --db fromDB --gzip --archive | mongorestore --drop --gzip --archive --nsFrom "fromDB.collectionName" --nsTo "toDB.collectionName"

빠른 복사를 하고 싶은 경우는 느리지만 동작합니다.

use fromDB 
db.collectionName.find().forEach(function(x){
   db.getSiblingDB('toDB')['collectionName'].insert(x);
});"

여기서 헤로쿠 사용자가 우연히 발견되어 저와 같은 데이터를 스테이징 데이터베이스에서 프로덕션 데이터베이스로 복사하거나 그 반대로 복사하는 경우(N.B. 오류는 없고 ATM을 확인할 수 없습니다. 가능한 한 빨리 코드의 유효성을 확인합니다).

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"

로보몽고는 언제든지 이용하실 수 있습니다.v0.8.3에서는 컬렉션을 마우스 오른쪽 버튼으로 클릭하고 "Copy Collection to Database"를 선택하면 이를 수행할 수 있는 도구가 있습니다.

상세한 것에 대하여는, http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/ 를 참조해 주세요.

이 기능은 버그가 있기 때문에 0.8.5에서 삭제되었기 때문에 테스트하려면 0.8.3 또는 0.8.4를 사용해야 합니다.

데이터베이스, 컬렉션 또는 특정 컬렉션 다운로드 링크를 클릭하여 내보내기 및 Import 도구가 있는 "Studio3T for MongoDB"를 사용합니다.https://studio3t.com/download/

은 MongoDB Atlas DB Import를 사용하는 입니다.mongodump&mongorestore명령어를 지정합니다.

기존 DB에서 덤프를 만들려면 다음을 사용합니다.

mongodump --uri="<connection-uri>"

https://www.mongodb.com/docs/database-tools/mongodump/ 에서 검색할 수 있는 기타 연결 옵션이 있습니다.

덤프가 dump/디렉토리에 정상적으로 작성되면 다음과 같이 다른 DB에 Import를 사용할 수 있습니다.

mongorestore --uri="<connection-uri-of-other-db>" <dump-file-location>

mongorestore에서도 마찬가지로 특정 컬렉션을 복원하는 명령어와 함께 검색할 수 있는 다른 연결 옵션이 있습니다.https://www.mongodb.com/docs/database-tools/mongorestore/

덤프 파일의 위치는 덤프 디렉토리 내에 있습니다.덤프한 DB 이름과 동일한 이름의 서브 디렉토리가 있을 수 있습니다.예를 들어 테스트 DB를 덤프한 경우 덤프 파일 위치는 /dump/test가 됩니다.

내 경우 새 컬렉션의 이전 컬렉션 속성의 하위 집합을 사용해야 했습니다.그래서 저는 새로운 컬렉션에서 insert를 호출하면서 이러한 속성을 선택하게 되었습니다.

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

컬렉션(myCollection1)을 MongoDB 데이터베이스 간에 복사하려면 다음 절차를 수행합니다.

**Server1:**
myHost1.com 
myDbUser1
myDbPasword1
myDb1
myCollection1

outputfile:
myfile.json 

**Server2:**
myHost2.com 
myDbUser2
myDbPasword2
myDb2
myCollection2 

다음과 같이 할 수 있습니다.

mongoexport  --host myHost1.com --db myDb1 -u myDbUser1  -p myDbPasword1 --collection myCollection1   --out  myfile.json 

그 후, 다음과 같이 합니다.

mongoimport  --host myHost2.com --db myDb2 -u myDbUser2  -p myDbPasword2 --collection myCollection2   --file myfile.json 

CSV 파일을 사용한 다른 경우:

Server1:
myHost1.com 
myDbUser1
myDbPasword1
myDb1
myCollection1
fields.txt
    fieldName1
    fieldName2

outputfile:
myfile.csv

Server2:
myHost2.com 
myDbUser2
myDbPasword2
myDb2
myCollection2

다음과 같이 할 수 있습니다.

mongoexport  --host myHost1.com --db myDb1 -u myDbUser1  -p myDbPasword1 --collection myCollection1   --out  myfile.csv --type=csv

csv 파일(name1.clolumname1.string())에 clolumn 유형을 추가한 후 다음을 수행합니다.

mongoimport  --host myHost2.com --db myDb2 -u myDbUser2  -p myDbPasword2 --collection myCollection2   --file myfile.csv --type csv --headerline --columnsHaveTypes

Mongo를 할 수 있습니다.db.copyDatabase★★★★

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

참고 자료: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/

언급URL : https://stackoverflow.com/questions/11554762/how-to-copy-a-collection-from-one-database-to-another-in-mongodb

반응형