MongoDB에서 배열 안에 포함된 특정 하위 항목(sub-item)의 값을 수정하려면 위치 연산자($)를 사용할 수 있습니다. 이 연산자는 쿼리 조건과 일치하는 첫 번째 배열 요소를 자동으로 찾아 해당 위치의 값만 업데이트해 줍니다.
이번 글에서는 실제 예제를 통해 배열 내 하위 항목을 설정하는 과정을 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 문서가 담긴 컬렉션을 생성합니다.
> db.demo22.insertOne(
... {
... ProductId:101,
... ProductDetails:
... [
... {
... ProductFirstPrice: '35',
... ProductSecondPrice: '75'
... },
... {
... ProductFirstPrice: '',
... ProductSecondPrice:''
... },
... {
... ProductFirstPrice: '78',
... ProductSecondPrice:'24'
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e14c0b422d07d3b95082e70")
}
위 문서는 ProductId와 세 개의 가격 정보(ProductDetails)를 배열 형태로 가지고 있으며, 두 번째 배열 요소는 값이 비어 있는 상태입니다.
2단계: find()로 전체 문서 조회
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo22.find().pretty();
이 명령은 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5e14c0b422d07d3b95082e70"),
"ProductId" : 101,
"ProductDetails" : [
{
"ProductFirstPrice" : "35",
"ProductSecondPrice" : "75"
},
{
"ProductFirstPrice" : "",
"ProductSecondPrice" : ""
},
{
"ProductFirstPrice" : "78",
"ProductSecondPrice" : "24"
}
]
}3단계: 위치 연산자($)로 배열 하위 항목 업데이트
다음은 배열 내 하위 항목을 설정하는 MongoDB 쿼리입니다.
> db.demo22.update({ "ProductDetails.ProductFirstPrice" : "35" },
... { $set : { "ProductDetails.$.ProductFirstPrice" : "" }}, false, true);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })여기서 핵심은 "ProductDetails.$" 부분입니다. $ 기호가 조건(ProductFirstPrice가 '35'인 요소)과 일치하는 배열 요소의 인덱스를 대신하며, 해당 요소의 ProductFirstPrice 값만 빈 문자열('')로 변경합니다.
- nMatched : 1 — 조건과 일치한 문서 수
- nModified : 1 — 실제로 수정된 문서 수
참고로 update() 호출 시 마지막에 전달한 false, true는 각각 upsert(문서가 없으면 생성)를 비활성화하고 multi(일치하는 모든 문서 업데이트)를 활성화하는 옵션입니다. 최신 MongoDB 버전에서는 이를 대체하는 updateOne(), updateMany() 사용이 권장됩니다.
4단계: 업데이트 결과 확인
다시 find() 메서드로 전체 문서를 조회해 변경 사항을 확인합니다.
> db.demo22.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e14c0b422d07d3b95082e70"),
"ProductId" : 101,
"ProductDetails" : [
{
"ProductFirstPrice" : "",
"ProductSecondPrice" : "75"
},
{
"ProductFirstPrice" : "",
"ProductSecondPrice" : ""
},
{
"ProductFirstPrice" : "78",
"ProductSecondPrice" : "24"
}
]
}첫 번째 배열 요소의 ProductFirstPrice가 '35'에서 ''(빈 문자열)로 성공적으로 변경된 것을 확인할 수 있습니다. 이처럼 위치 연산자 $를 활용하면 배열 전체를 다시 저장하지 않고도 조건과 일치하는 특정 요소만 효율적으로 업데이트할 수 있습니다.