Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 배열의 여러 요소를 한 번에 업데이트하는 방법 ($[] 연산자 활용)

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 옵션을 함께 사용하는 방법도 있습니다.