MongoDB에서 기존 문서의 특정 필드를 배열(Array) 형태로 변환해야 하는 경우가 종종 있습니다. 예를 들어 단일 문자열로 저장된 데이터를 나중에 여러 값을 담을 수 있도록 배열 구조로 바꾸고 싶다면, forEach() 메서드 안에서 update 작업을 수행하면 간단하게 처리할 수 있습니다.
1. 테스트용 컬렉션 생성
먼저 insertOne() 메서드를 사용해 샘플 문서가 담긴 컬렉션을 만들어 보겠습니다.
> db.demo18.insertOne({"StudentName":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e1387fc55d0fc6657d21f0e")
}2. 현재 문서 상태 확인
find() 메서드를 호출해 컬렉션에 저장된 모든 문서를 조회합니다.
> db.demo18.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e1387fc55d0fc6657d21f0e"), "StudentName" : "John" }현재 StudentName 필드는 일반 문자열 값으로 저장되어 있는 것을 확인할 수 있습니다.
3. update 작업으로 필드를 배열로 변환하기
이제 forEach()를 이용해 컬렉션의 모든 문서를 순회하면서, 각 문서의 _id를 조건으로 $set 연산자를 적용해 StudentName 필드를 배열로 변경합니다.
> db.demo18.find().forEach(function(myDocument) {
... db.demo18.update(
... { _id: myDocument._id },
... { "$set": { "StudentName": [myDocument.StudentName] } }
... );
... })여기서 핵심은 [myDocument.StudentName]처럼 기존 값을 대괄호([])로 감싸 배열 요소로 만들어 주는 부분입니다. 이렇게 하면 모든 문서의 해당 필드가 한 번에 배열 구조로 변환됩니다.
4. 변환 결과 확인
변환이 완료되면 다시 find() 메서드로 결과를 조회해 봅니다.
{ "_id" : ObjectId("5e1387fc55d0fc6657d21f0e"), "StudentName" : [ "John" ] }StudentName 필드가 문자열 "John"에서 배열 [ "John" ]로 성공적으로 변환된 것을 확인할 수 있습니다.
참고 사항
최신 MongoDB 버전에서는 update()보다 updateOne(), updateMany() 같은 메서드 사용이 권장됩니다. 또한 위 예제처럼 forEach()와 조건별 업데이트를 조합하면 대량의 데이터를 대상으로 하는 스키마 마이그레이션 작업에도 유용하게 활용할 수 있습니다.