MongoDB에서 $push 연산자와 위치 연산자($)를 함께 사용하면, 쿼리 조건과 일치하는 배열 내부의 요소를 찾아 해당 요소에 새로운 값을 추가할 수 있습니다. 이 글에서는 실제 예제를 통해 그 과정을 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용하여 컬렉션을 생성하고 문서를 하나 삽입합니다. 이 문서에는 UserDetails라는 배열 필드가 포함되어 있습니다.
> db.updateArrayElementDemo.insertOne(
{
"UserDetails":
[
{
"UserName": "Chris",
"UserAge": 23
}
]
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce9029378f00858fb12e90d")
}
2. find() 메서드로 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다. 가독성을 높이기 위해 pretty()를 함께 사용했습니다.
> db.updateArrayElementDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{
"_id" : ObjectId("5ce9029378f00858fb12e90d"),
"UserDetails" : [
{
"UserName" : "Chris",
"UserAge" : 23
}
]
}
3. $push로 조건과 일치하는 배열 요소 업데이트하기
이제 핵심 부분입니다. $push 연산자와 위치 연산자($)를 조합하면, 첫 번째 인수로 전달한 조건(UserDetails.UserAge: 23)과 일치하는 배열 요소를 자동으로 찾아 해당 위치에 새로운 필드를 추가할 수 있습니다.
db.updateArrayElementDemo.update(
{"UserDetails.UserAge": 23},
{"$push": {"UserDetails.$.UserCountryName": "US"}}
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
여기서 UserDetails.$ 표기법은 조건과 일치하는 배열 요소의 위치를 가리킵니다. 실행 결과 nModified: 1이 반환되었으므로, 한 개의 문서가 성공적으로 수정되었다는 것을 알 수 있습니다.
참고: MongoDB 4.2 이상 버전에서는 기존의 update() 메서드가 더 이상 권장되지 않습니다. 최신 환경에서는 동일한 작업을 updateOne() 또는 updateMany() 메서드로 수행하는 것이 좋습니다.
4. 업데이트 결과 확인하기
문서가 의도대로 수정되었는지 다시 한번 find() 메서드로 확인해 보겠습니다.
> db.updateArrayElementDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ce9029378f00858fb12e90d"),
"UserDetails" : [
{
"UserName" : "Chris",
"UserAge" : 23,
"UserCountryName" : [
"US"
]
}
]
}
출력 결과를 보면 UserAge가 23인 배열 요소에 UserCountryName이라는 새로운 필드가 생성되고, 값 "US"가 배열 형태로 추가된 것을 확인할 수 있습니다.
정리
이처럼 MongoDB에서는 $push 연산자와 위치 연산자($)를 활용하면 별도의 복잡한 로직 없이도 조건과 일치하는 특정 배열 요소만 정확하게 업데이트할 수 있습니다. 배열 데이터를 다루는 애플리케이션을 개발할 때 매우 유용하게 활용되는 패턴이므로 꼭 기억해 두시기 바랍니다.