MongoDB에서 배열 내 모든 요소를 한 번에 업데이트하려면 $[] 연산자를 사용하면 됩니다. $[]는 올 포지셔널(all positional) 연산자로, 지정된 배열 필드의 모든 요소에 대해 업데이트 작업을 수행하도록 지시합니다.
1. 샘플 컬렉션 생성하기
먼저 문서가 담긴 컬렉션을 생성해 보겠습니다.
> db.demo385.insertOne({"ServerLogs": [
... {
... "status":"InActive"
... },
... {
... "status":"InActive"
... },
... {
... "status":"InActive"
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5b6a7522064be7ab44e7f5")
}2. 컬렉션의 모든 문서 조회하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo385.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e5b6a7522064be7ab44e7f5"),
"ServerLogs" : [
{
"status" : "InActive"
},
{
"status" : "InActive"
},
{
"status" : "InActive"
}
]
}현재 세 개의 로그 항목이 모두 InActive 상태인 것을 확인할 수 있습니다.
3. $[] 연산자로 배열의 모든 요소 업데이트하기
이제 $[] 연산자를 사용해 배열의 모든 요소를 한 번에 업데이트하는 쿼리를 살펴보겠습니다.
> db.demo385.update(
... { "_id" : ObjectId("5e5b6a7522064be7ab44e7f5") },
... { "$set": { "ServerLogs.$[].status": "Active" }}
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })쿼리 실행 결과, 매칭된 문서 1개에서 수정이 정상적으로 이루어졌습니다(nModified : 1).
4. 업데이트 결과 확인하기
다시 find() 메서드로 문서를 조회해 변경 사항을 확인해 보겠습니다.
> db.demo385.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e5b6a7522064be7ab44e7f5"),
"ServerLogs" : [
{
"status" : "Active"
},
{
"status" : "Active"
},
{
"status" : "Active"
}
]
}배열 내 모든 status 필드가 InActive에서 Active로 성공적으로 변경된 것을 확인할 수 있습니다.
핵심 정리
$[]는 올 포지셔널(all positional) 연산자로, 배열 필드의 모든 요소를 대상으로 업데이트를 적용합니다.$set과 함께"배열필드.$[].하위필드"형태로 경로를 지정하면 됩니다.- 특정 조건에 맞는 요소만 업데이트하고 싶다면
$[<identifier>]와arrayFilters옵션을 함께 사용하는 방법도 있습니다.