MongoDB에서 배열 필드의 모든 요소를 한 번에 수정하고 싶다면 모든 위치 연산자(all positional operator)인 $[]를 활용할 수 있습니다. 이 글에서는 실제 예제를 통해 위치 연산자를 사용해 배열 값을 일괄 변경하는 과정을 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 데모용 컬렉션을 생성하고 문서를 삽입합니다.
> db.demo324.insertOne({"ListOfValues":[10,20,30]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e516349f8647eb59e562073")
}
2. 삽입된 문서 확인
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo324.find().pretty();
위 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5e516349f8647eb59e562073"),
"ListOfValues" : [
10,
20,
30
]
}
3. 위치 연산자($[])를 사용한 업데이트 쿼리
이제 $[] 연산자를 활용해 배열 내 모든 요소를 한꺼번에 변경하는 업데이트 쿼리를 실행해 보겠습니다.
> db.demo324.update({"ListOfValues":[10,20,30]},{ $set: { "ListOfValues.$[]": "MongoDB" } }, { upsert: true } );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
실행 결과를 보면 조건에 일치한 문서가 1개(nMatched: 1)이고, 실제로 수정된 문서도 1개(nModified: 1)임을 확인할 수 있습니다.
4. 업데이트 결과 확인
다시 find() 메서드로 문서를 조회해 변경 사항을 확인해 보겠습니다.
> db.demo324.find().pretty();
결과는 다음과 같습니다.
{
"_id" : ObjectId("5e516349f8647eb59e562073"),
"ListOfValues" : [
"MongoDB",
"MongoDB",
"MongoDB"
]
}
배열에 있던 숫자 값 10, 20, 30이 모두 문자열 "MongoDB"로 일괄 변경된 것을 볼 수 있습니다.
정리
$[] 연산자는 배열 필드의 모든 요소를 대상으로 업데이트를 적용할 때 매우 유용합니다. 조건 없이 배열 전체를 한 번의 쿼리로 수정할 수 있어 코드가 간결해지고 성능 면에서도 효율적입니다. 참고로 $[] 연산자는 MongoDB 3.6 이상 버전에서 지원되며, 특정 조건에 맞는 요소만 선택적으로 수정하고 싶다면 $[identifier] 연산자와 arrayFilters 옵션을 함께 사용하면 됩니다.