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

MongoDB에서 새 컬렉션으로 행(문서) 복사하는 방법 – aggregate와 $out 활용 가이드

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 단계를 활용하는 것도 고려해 보세요.