Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 한 데이터베이스에서 다른 데이터베이스로 컬렉션 복사하는 방법

MongoDB 컬렉션을 다른 데이터베이스로 복사하는 방법

MongoDB에는 한 데이터베이스의 컬렉션을 다른 데이터베이스로 직접 복사하는 전용 명령어가 존재하지 않습니다. 대신 find() 메서드로 문서를 조회한 뒤 forEach()getSiblingDB()를 조합하여 문서를 하나씩 대상 데이터베이스에 삽입하는 방식으로 이를 구현할 수 있습니다.

기본적인 문법은 다음과 같습니다.

db.yourCollectionName.find().forEach(function(yourVariableName){
    db.getSiblingDB('yourDestinationDatabase')['yourCollectionName'].insert(yourVariableName);
});

여기서 getSiblingDB()는 현재 접속 중인 mongod 인스턴스 내에 있는 다른 데이터베이스를 참조할 때 사용하는 메서드입니다. 이번 글에서는 test 데이터베이스에 컬렉션을 생성한 후, 이를 sample이라는 이름의 다른 데이터베이스로 복사하는 과정을 단계별로 살펴보겠습니다.

1단계: test 데이터베이스에 컬렉션 생성하기

먼저 test 데이터베이스로 전환한 뒤, 문서가 포함된 컬렉션을 생성합니다. 문서 삽입에는 insertOne() 메서드를 사용합니다.

<test>

> use test
switched to db test
> db.copyThisCollectionToSampleDatabaseDemo.insertOne({"User_Id":101,"UserName":"Larry"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c77ad622386c62d05142a67")
}
> db.copyThisCollectionToSampleDatabaseDemo.insertOne({"User_Id":102,"UserName":"Maxwell"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c77ad6e2386c62d05142a68")
}
> db.copyThisCollectionToSampleDatabaseDemo.insertOne({"User_Id":103,"UserName":"Robert"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c77ad7c2386c62d05142a69")
}

세 개의 문서가 성공적으로 삽입되었습니다. 이제 find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.

> db.copyThisCollectionToSampleDatabaseDemo.find().pretty();

실행 결과는 다음과 같습니다.

{
    "_id" : ObjectId("5c77ad622386c62d05142a67"),
    "User_Id" : 101,
    "UserName" : "Larry"
}
{
    "_id" : ObjectId("5c77ad6e2386c62d05142a68"),
    "User_Id" : 102,
    "UserName" : "Maxwell"
}
{
    "_id" : ObjectId("5c77ad7c2386c62d05142a69"),
    "User_Id" : 103,
    "UserName" : "Robert"
}

2단계: sample 데이터베이스 상태 확인하기

복사 작업을 진행하기 전에, sample 데이터베이스에 copyThisCollectionToSampleDatabaseDemo라는 이름의 컬렉션이 이미 존재하는지 먼저 확인해 보겠습니다.

<sample>

> use sample;
switched to db sample
> show collections;

실행 결과는 다음과 같습니다.

deleteDocuments
deleteDocumentsDemo
deleteInformation
employee
internalArraySizeDemo
sourceCollection
updateInformation
userInformation

출력 결과를 보면 sample 데이터베이스에는 copyThisCollectionToSampleDatabaseDemo 컬렉션이 아직 존재하지 않습니다.

3단계: 컬렉션 복사 실행하기

이제 test 데이터베이스로 돌아가서 앞서 소개한 find().forEach()getSiblingDB()를 활용한 쿼리를 실행하여 컬렉션을 sample 데이터베이스로 복사합니다.

> use test;
switched to db test
> db.copyThisCollectionToSampleDatabaseDemo.find().forEach(function(send){
db.getSiblingDB('sample')['copyThisCollectionToSampleDatabaseDemo'].insert(send); });

이 쿼리는 원본 컬렉션의 각 문서를 순회하면서, 동일한 구조의 컬렉션을 대상 데이터베이스에 생성하고 문서를 그대로 삽입합니다. 문서의 _id 값까지 함께 복사되므로 원본 데이터가 그대로 유지됩니다.

4단계: 복사 결과 확인하기

복사가 정상적으로 완료되었는지 다시 한번 sample 데이터베이스의 컬렉션 목록을 확인해 보겠습니다.

> use sample;
switched to db sample
> show collections;

실행 결과는 다음과 같습니다.

copyThisCollectionToSampleDatabaseDemo
deleteDocuments
deleteDocumentsDemo
deleteInformation
employee
internalArraySizeDemo
sourceCollection
updateInformation
userInformation

출력 결과를 보면 copyThisCollectionToSampleDatabaseDemo 컬렉션이 sample 데이터베이스에 새롭게 추가된 것을 확인할 수 있습니다. 물론 원본인 test 데이터베이스에도 해당 컬렉션은 그대로 남아 있습니다.

참고: 최신 버전에서 사용할 수 있는 대안

위 방법은 모든 MongoDB 버전에서 동작하는 범용적인 방식입니다. 다만 MongoDB 4.4 이상을 사용한다면 aggregate() 파이프라인의 $out(덮어쓰기) 또는 $merge(병합) 연산자를 활용하면 서버 측에서 더 효율적으로 컬렉션을 복사할 수 있습니다. 또한 대량의 데이터를 다룰 때는 클라이언트에서 문서를 하나씩 순회하는 방식보다 서버 측 집계 연산이 성능 면에서 유리하므로, 환경에 맞는 방법을 선택하는 것이 좋습니다.