MongoDB에서 새 컬렉션으로 행(문서) 복사하는 방법
MongoDB에서 한 컬렉션의 행(문서)을 다른 컬렉션으로 복사하려면 aggregate() 메서드에 $sample과 $out 파이프라인 단계를 조합하면 됩니다. $sample이 지정한 개수만큼 문서를 선택하고, $out이 그 결과를 지정한 새 컬렉션에 저장합니다.
기본 문법
db.yourOldCollectionName.aggregate([{ $sample: { size: 333333 }}, {$out: "yourNewCollectionName"} ],{allowDiskUse: true});
위 문법에서 "yourOldCollectionName"은 복사할 원본 컬렉션 이름이며, "yourNewCollectionName"은 복사된 데이터가 저장될 새 컬렉션 이름입니다. allowDiskUse: true 옵션은 집계 작업 중 메모리가 부족할 경우 디스크를 임시 공간으로 사용하도록 허용합니다.
1단계: 원본 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 문서가 담긴 컬렉션을 생성합니다.
> db.sourceCollection.insertOne({"EmployeeName":"Robert","EmployeeSalary":15000});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0397c1f5e889d7a5199506")
}
> db.sourceCollection.insertOne({"EmployeeName":"David","EmployeeSalary":25000});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0397c3f5e889d7a5199507")
}
> db.sourceCollection.insertOne({"EmployeeName":"Mike","EmployeeSalary":29000});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0397c4f5e889d7a5199508")
}
2단계: 원본 컬렉션의 모든 문서 확인
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.sourceCollection.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e0397c1f5e889d7a5199506"),
"EmployeeName" : "Robert",
"EmployeeSalary" : 15000
}
{
"_id" : ObjectId("5e0397c3f5e889d7a5199507"),
"EmployeeName" : "David",
"EmployeeSalary" : 25000
}
{
"_id" : ObjectId("5e0397c4f5e889d7a5199508"),
"EmployeeName" : "Mike",
"EmployeeSalary" : 29000
}
3단계: 새 컬렉션(destinationCollection) 생성
복사 대상이 될 새 컬렉션을 createCollection() 메서드로 생성합니다.
> db.createCollection('destinationCollection');
{ "ok" : 1 }
4단계: sourceCollection → destinationCollection 문서 복사
다음 쿼리는 "sourceCollection"의 행을 새 컬렉션인 "destinationCollection"으로 복사합니다.
> db.sourceCollection.aggregate([{ $sample: { size: 333333 }}, {$out: "destinationCollection"} ],{allowDiskUse: true});
5단계: 복사 결과 확인
find() 메서드로 새 컬렉션의 모든 문서를 조회합니다.
> db.destinationCollection.find().pretty()
아래 출력 결과에서 확인할 수 있듯이, 새 컬렉션 "destinationCollection"은 첫 번째 컬렉션 "sourceCollection"의 레코드를 성공적으로 복사했습니다.
{
"_id" : ObjectId("5e0397c4f5e889d7a5199508"),
"EmployeeName" : "Mike",
"EmployeeSalary" : 29000
}
{
"_id" : ObjectId("5e0397c3f5e889d7a5199507"),
"EmployeeName" : "David",
"EmployeeSalary" : 25000
}
{
"_id" : ObjectId("5e0397c1f5e889d7a5199506"),
"EmployeeName" : "Robert",
"EmployeeSalary" : 15000
}
참고 사항
$sample은 문서를 무작위로 선택하므로, 위 예제처럼size값을 전체 문서 수보다 크게 설정하면 모든 문서가 복사되지만 저장 순서는 섞일 수 있습니다.- 원본 순서를 그대로 유지하면서 전체 문서를 복사하려면
{ $match: {} }단계를 사용하거나,find().forEach()로 문서를 하나씩 삽입하는 방법도 좋습니다. $out은 지정한 컬렉션이 이미 존재하면 기존 내용을 완전히 덮어쓰므로, 중요한 데이터가 있는 컬렉션 이름을 실수로 사용하지 않도록 주의해야 합니다. MongoDB 4.4 이상에서는 기존 컬렉션에 결과를 병합할 수 있는$merge단계를 활용하는 것도 고려해 보세요.