MongoDB에서 기존 배열에 새로운 요소를 추가하려면 $addToSet 연산자와 함께 update() 메서드를 사용하면 됩니다. $addToSet은 배열에 값을 추가할 때 중복된 값이 이미 존재하지 않는 경우에만 추가한다는 점이 특징입니다.
1. 샘플 컬렉션 생성
먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.pushElements.insertOne({"Comments":["Good","Awesome","Nice"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd682597924bb85b3f48953")
}
2. 문서 조회하기
find() 메서드를 사용해 컬렉션의 모든 문서를 확인합니다.
> db.pushElements.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cd682597924bb85b3f48953"),
"Comments" : [
"Good",
"Awesome",
"Nice"
]
}
3. 배열에 요소 추가하기
이제 $addToSet 연산자를 사용하여 기존 배열에 새로운 요소를 추가합니다.
> db.pushElements.update(
{_id:ObjectId("5cd682597924bb85b3f48953")},
{ "$addToSet":{"Comments":"Cool"} },
upsert=true
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
실행 결과 nModified : 1이 반환되며, 하나의 문서가 성공적으로 수정되었음을 알 수 있습니다.
4. 결과 확인
문서를 다시 한번 조회하여 요소가 정상적으로 추가되었는지 확인해 보겠습니다.
> db.pushElements.find().pretty();
"Cool"이라는 값이 배열 끝에 성공적으로 추가된 것을 확인할 수 있습니다.
{
"_id" : ObjectId("5cd682597924bb85b3f48953"),
"Comments" : [
"Good",
"Awesome",
"Nice",
"Cool"
]
}
$addToSet과 $push의 차이점
배열에 요소를 추가할 때 자주 비교되는 연산자로 $push가 있습니다. 두 연산자의 주요 차이는 다음과 같습니다.
- $addToSet: 배열에 동일한 값이 이미 존재하면 아무 작업도 하지 않습니다. 즉, 중복을 허용하지 않습니다.
- $push: 중복 여부와 관계없이 항상 배열 끝에 값을 추가합니다.
따라서 댓글 목록처럼 고유한 값만 유지하고 싶은 경우에는 $addToSet을, 단순히 순서대로 값을 누적하고 싶은 경우에는 $push를 사용하는 것이 좋습니다.