네, 가능합니다. MongoDB에서는 update() 메서드를 사용하면 동일한 업데이트 작업 안에서 $addToSet 연산자를 여러 번 활용할 수 있습니다. $addToSet은 배열에 값을 추가하되, 이미 존재하는 값은 중복해서 넣지 않는 연산자로, 중복 없는 배열을 유지할 때 매우 유용합니다.
1. 컬렉션 생성 및 문서 삽입
먼저 문서가 담긴 컬렉션을 생성해 보겠습니다.
> db.demo27.insertOne({"StudentDetails":{"101":{"Subject":["Java"]}}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e15f9e822d07d3b95082e7f")
}
> db.demo27.insertOne({"StudentDetails":{"101":{"Subject":["MySQL"]}}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e15f9eb22d07d3b95082e80")
}
2. 삽입된 문서 확인
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.demo27.find().pretty();
위 명령은 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5e15f9e822d07d3b95082e7f"),
"StudentDetails" : {
"101" : {
"Subject" : [
"Java"
]
}
}
}
{
"_id" : ObjectId("5e15f9eb22d07d3b95082e80"),
"StudentDetails" : {
"101" : {
"Subject" : [
"MySQL"
]
}
}
}
3. $addToSet으로 배열 값 추가하기
다음은 $addToSet을 사용해 StudentDetails.101.Subject 배열에 "MongoDB"를 추가하는 쿼리입니다.
> db.demo27.update({}, {$addToSet: {"StudentDetails.101.Subject": "MongoDB"}}, {upsert: true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
실행 결과에서 nMatched가 1로 표시된 것은 조건에 일치한 한 개의 문서가 실제로 수정되었음을 의미합니다.
4. 업데이트 결과 확인
다시 find() 메서드로 전체 문서를 조회해 보겠습니다.
> db.demo27.find().pretty();
결과는 다음과 같습니다.
{
"_id" : ObjectId("5e15f9e822d07d3b95082e7f"),
"StudentDetails" : {
"101" : {
"Subject" : [
"Java",
"MongoDB"
]
}
}
}
{
"_id" : ObjectId("5e15f9eb22d07d3b95082e80"),
"StudentDetails" : {
"101" : {
"Subject" : [
"MySQL"
]
}
}
}
첫 번째 문서의 Subject 배열에 "MongoDB"가 정상적으로 추가된 것을 확인할 수 있습니다. 두 번째 문서는 업데이트 조건에 해당하지 않아 원본 그대로 유지됩니다.
5. 하나의 업데이트에서 $addToSet 여러 번 활용하기
하나의 update() 호출 안에서 서로 다른 필드에 대해 $addToSet을 동시에 적용할 수도 있습니다. $addToSet 객체 안에 여러 필드-값 쌍을 나열하면 됩니다.
> db.demo27.update(
... {},
... {
... $addToSet: {
... "StudentDetails.101.Subject": "MongoDB",
... "StudentDetails.102.Subject": "Python"
... }
... },
... {upsert: true}
... )
이처럼 단 한 번의 업데이트로 여러 배열에 동시에 값을 추가할 수 있습니다. 또한 upsert 옵션이 true로 설정되어 있기 때문에, 조건에 일치하는 문서가 없을 경우 새 문서가 자동으로 생성됩니다. 참고로 MongoDB에서는 하나의 업데이트 문서 내에 동일한 연산자를 중복 선언할 수 없으므로, 여러 필드에 $addToSet을 적용하려면 위 예제처럼 하나의 $addToSet 안에 필드들을 묶어 작성하는 것이 올바른 방식입니다.