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

MongoDB에서 $set과 위치 $ 연산자로 배열 내 특정 문서 업데이트하기

MongoDB에서 배열 안의 특정 문서를 수정하려면 $set 연산자와 위치 $ 연산자(positional $ operator)를 함께 사용하면 됩니다. 이때 문서 업데이트는 updateOne() 메서드를 통해 수행하며, 이 메서드는 쿼리 필터(query filter)에 일치하는 단일 문서만 컬렉션에서 갱신합니다.

1. 샘플 컬렉션 생성

먼저 insertOne() 메서드로 문서가 포함된 컬렉션을 생성합니다.

> db.demo462.insertOne(
... {
...     "id": 1,
...     "DueDateDetails": [
...         {
...             "Name": "David",
...             "Age": 21,
...             "CountryName": ["US", "UK"]
...         },
...         {
...             "Name": "Chris",
...             "Age": 23,
...             "CountryName": ["UK"]
...         }
...     ]
... }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e7f6c59cb66ccba22cc9dce")
}

2. 컬렉션의 모든 문서 조회

find() 메서드를 사용해 컬렉션의 모든 문서를 확인합니다.

> db.demo462.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e7f6c59cb66ccba22cc9dce"), "id" : 1, "DueDateDetails" : [ { "Name" : "David", "Age" : 21, "CountryName" : [ "US", "UK" ] }, { "Name" : "Chris", "Age" : 23, "CountryName" : [ "UK" ] } ] }

3. $set과 위치 $ 연산자로 배열 내 문서 업데이트

다음은 updateOne() 메서드와 함께 $set 및 위치 $ 연산자를 사용하여 배열 내부의 특정 문서를 업데이트하는 쿼리입니다. 여기서는 이름이 "Chris"인 요소의 CountryName 값을 "AUS"로 변경합니다.

> db.demo462.updateOne(
...     {id: 1, "DueDateDetails.Name": "Chris"},
...     { $set: { "DueDateDetails.$.CountryName": "AUS"} }
... )
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

쿼리 필터에서 id: 1"DueDateDetails.Name": "Chris" 조건을 함께 지정했기 때문에, MongoDB는 해당 조건에 일치하는 배열 요소의 위치를 자동으로 파악하고 위치 $ 연산자($)가 그 첫 번째 일치 요소를 가리키게 됩니다.

4. 업데이트 결과 확인

업데이트 후 find().pretty() 메서드로 변경된 문서를 다시 조회합니다.

> db.demo462.find().pretty();

실행 결과는 다음과 같습니다.

{
    "_id" : ObjectId("5e7f6c59cb66ccba22cc9dce"),
    "id" : 1,
    "DueDateDetails" : [
        {
            "Name" : "David",
            "Age" : 21,
            "CountryName" : [
                "US",
                "UK"
            ]
        },
        {
            "Name" : "Chris",
            "Age" : 23,
            "CountryName" : "AUS"
        }
    ]
}

출력 결과를 보면 이름이 "Chris"인 배열 요소의 CountryName 값이 기존의 ["UK"]에서 "AUS"로 성공적으로 변경된 것을 확인할 수 있습니다. 반면 "David"의 데이터는 그대로 유지되었으며, 이것이 바로 위치 $ 연산자를 활용해 배열 내 특정 요소만 정확히 업데이트하는 방식입니다.