MongoDB에서 두 개 이상의 컬렉션을 특정 필드 값을 기준으로 하나로 합치는 방법에 대하여 알아봅니다.



# MongoDB 컬렉션 필드 기준 합치기
컬렉션을 하나로 합치는 방법은 몇 가지가 있습니다. 그 중에서 csv나 엑셀 등의 포맷으로 변경하는 방법도 하나의 방법입니다.


! Collection 엑셀, csv로 합치기
말 그대로 csv, excel 포맷을 변경한 후 다시 합치는 방법입니다. 간략하게 설명하면 아래와 같습니다.
하나. 여러 개의 MongoDB 컬렉션들을 텍스트 파일로 변경
둘. 하나의 파일로 합친 다음 다시 MongoDB로 옮기기
위와 같이 저 각 컬렉션 데이터를 csv나 엑셀로 변환하기 위해 먼저 모든 데이터를 export합니다. 그 후 일치 될 필드를 기준으로 vlookup을 사용해 추가할 값을 찾아 원하는 데이터를 가져옵니다. 그리고 다시 저장하는 방법이죠.

- 컬렉션 데이터 export하기
- 엑셀의 vlookup() 함수를 사용하여 일치하는 row 찾기
- 일치하는 row의 값을 가져와 붙이기
- 하나로 모두 합치기
- 다시 mongodb에 import 하기


이 방법도 간단합니다. 주의할 점 및 중요한 부분은 구분 될 필드명에 주의해야하고 csv의 경우 구분자가 될 문자가 documents 내부에 사용된 경우 에러가 나타날 수 있어 파싱 등 추가적인 작업이 필요할 수 있죠.

그래서 간단한 데이터의 경우 이 방법을 사용하길 추천합니다. 복잡한 컬렉션을 전체 합치려면 아래의 방법을 더 추천합니다.


! 컬렉션 커서 객체에 forEach() 사용하기
다른 방법보다도 이 방법이 가장 확실하고 간단합니다. 커서 객체에 forEach()를 사용하는 경우는 내부 값이나 필드 전체의 타입 변경 등에 많이 쓰이죠. 하지만 컬렉션 전체를 합치는 데에도 이 방법을 사용할 수 있습니다.

아래에서 그 방법을 알아봅니다. 먼저 합쳐질 컬렉션 두 개가 필요합니다. 아래와 같이 컬렉션 두 개가 있는 경우 예를들어 봅니다.

@ 컬렉션 이름
- CollectionA
- CollectionB

@ 기준  필드 명(동일한 값을 가지는 필드)
- ID

두 컬렉션은 공통의 값을 가지는 필드 ID를 가지고 있다고 하겠습니다. 이제 두 Collection을 합치기 위해서 아래와 같이 mongocli에서 입력합니다. (참고로 mongocli는 mongo 커맨드를 입력하여 접근 할 수 있습니다.)
db.CollectionA.find().forEach(function(item) {
  cur = db.CollectionB.findOne({ ID: item.ID });
  if (no) {
    item.no = cur.no;
    db.CollectionA.save(item);
  }
});

이제 모든 코드가 작성되었습니다. 참고로 위 쿼리를 mongocli에서 동작하면 어떻게 될까요? CollectionA에는 새로운 필드 no가 생겨나고 그 값은 바로 CollectionB에서 찾아 가져온 값이 됩니다.

여기서 중요한 부분은 forEach() 내부에서 db.CollectionB와 같이 다른 컬렉션에 접근이 가능하다는 점입니다. 이와 같은 방법으로 원하는 필드를 합치는 것이 가능합니다.

여기까지 MongoDB의 컬렉션을 원하는 필드 기준, 선택한 필드만 가져올 수 있는 방법을 알아봤습니다.