MongoDB에서 $addToSet 연산자를 사용하면 이미 생성된 문서에 새로운 필드를 손쉽게 추가할 수 있습니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성
먼저 문서가 포함된 컬렉션을 만들어 보겠습니다.
> db.createFieldDemo.insertOne({"StudentFirstName":"John","StudentAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd99e28b50a6c6dd317ad95")
}
> db.createFieldDemo.insertOne({"StudentFirstName":"Larry","StudentAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd99e2fb50a6c6dd317ad96")
}
> db.createFieldDemo.insertOne({"StudentFirstName":"Chris","StudentAge":22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd99e38b50a6c6dd317ad97")
}
> db.createFieldDemo.insertOne({"StudentFirstName":"David","StudentAge":25});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd99e43b50a6c6dd317ad98")
}2단계: find() 메서드로 전체 문서 조회
다음은 find() 메서드를 사용하여 컬렉션의 모든 문서를 조회하는 쿼리입니다.
> db.createFieldDemo.find().pretty();
이 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5cd99e28b50a6c6dd317ad95"),
"StudentFirstName" : "John",
"StudentAge" : 21
}
{
"_id" : ObjectId("5cd99e2fb50a6c6dd317ad96"),
"StudentFirstName" : "Larry",
"StudentAge" : 23
}
{
"_id" : ObjectId("5cd99e38b50a6c6dd317ad97"),
"StudentFirstName" : "Chris",
"StudentAge" : 22
}
{
"_id" : ObjectId("5cd99e43b50a6c6dd317ad98"),
"StudentFirstName" : "David",
"StudentAge" : 25
}3단계: $addToSet으로 새 필드 생성
이제 새 필드를 생성하는 쿼리를 실행해 보겠습니다. 여기서는 특정 문서에 "StudentLastName"이라는 필드를 추가합니다.
> db.createFieldDemo.update({_id: ObjectId("5cd99e43b50a6c6dd317ad98")}, {$addToSet: {"StudentLastName": "Miller"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })4단계: 업데이트 결과 확인
업데이트가 정상적으로 적용되었는지 컬렉션의 모든 문서를 다시 조회해 보겠습니다.
> db.createFieldDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cd99e28b50a6c6dd317ad95"),
"StudentFirstName" : "John",
"StudentAge" : 21
}
{
"_id" : ObjectId("5cd99e2fb50a6c6dd317ad96"),
"StudentFirstName" : "Larry",
"StudentAge" : 23
}
{
"_id" : ObjectId("5cd99e38b50a6c6dd317ad97"),
"StudentFirstName" : "Chris",
"StudentAge" : 22
}
{
"_id" : ObjectId("5cd99e43b50a6c6dd317ad98"),
"StudentFirstName" : "David",
"StudentAge" : 25,
"StudentLastName" : [
"Miller"
]
}참고 사항
위 출력 결과에서 알 수 있듯이, $addToSet은 값을 배열 형태로 저장합니다. 즉, "StudentLastName" 필드는 문자열이 아닌 ["Miller"]라는 배열로 생성됩니다. 배열이 아닌 일반 스칼라 값(문자열 등)으로 필드를 추가하고 싶다면 $set 연산자를 사용하는 것이 좋습니다. 또한 $addToSet은 동일한 값이 이미 배열에 존재하면 중복 추가하지 않는다는 특징이 있어, 고유한 값 목록을 관리할 때 유용합니다.