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"의 데이터는 그대로 유지되었으며, 이것이 바로 위치 $ 연산자를 활용해 배열 내 특정 요소만 정확히 업데이트하는 방식입니다.