MongoDB에서 중첩된 내장 문서(nested embedded documents)를 업데이트하려면 update() 메서드와 위치 연산자인 positional($) 연산자를 함께 사용하면 됩니다. 먼저 예제용 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
1. 컬렉션 생성 및 문서 삽입
> db.demo643.insertOne({
... details : [
... {
... "CountryName":"US",
... StudentDetails:[{Name:"Chris"},{SubjectName:"MySQL"}]
... },
...
... {
... "CountryName":"UK",
... StudentDetails:[{Name:"Bob"},{SubjectName:"Java"}]
... }
... ]
... }
... )
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c737f6c954c74be91e6e3")
}위 쿼리는 demo643이라는 컬렉션을 만들고, 국가별 학생 정보가 배열 형태로 중첩되어 있는 문서 하나를 삽입합니다.
2. find()로 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo643.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e9c737f6c954c74be91e6e3"), "details" : [ { "CountryName" : "US", "StudentDetails" : [ { "Name" : "Chris" }, { "SubjectName" : "MySQL" } ] }, { "CountryName" : "UK", "StudentDetails" : [ { "Name" : "Bob" }, { "SubjectName" : "Java" } ] } ] }3. 중첩된 내장 문서 업데이트하기
이제 MongoDB에서 중첩된 내장 문서를 업데이트하는 실제 쿼리를 살펴보겠습니다. 조건문으로 details.CountryName이 "UK"인 배열 요소를 찾은 뒤, 위치 연산자($)를 사용해 해당 요소의 StudentDetails 배열에 새 데이터를 추가(push)합니다.
> db.demo643.update({"details.CountryName": "UK"}, {"$push": {"details.$.StudentDetails": {Marks:78}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })쿼리 실행 결과 nMatched: 1, nModified: 1이 반환되었으므로, 정확히 한 개의 문서가 매칭되어 성공적으로 수정되었습니다.
핵심 동작 원리
- {"details.CountryName": "UK"}: 배열 안에서 CountryName이 "UK"인 요소를 검색하는 조건입니다.
- $ (위치 연산자): 쿼리 조건에 매칭된 첫 번째 배열 요소의 자리 표시자 역할을 합니다.
- $push: 지정한 배열 필드 끝에 새 값을 추가하는 업데이트 연산자입니다.
4. 업데이트 결과 확인하기
다시 find() 메서드에 pretty()를 붙여 가독성 좋게 출력해 보겠습니다.
> db.demo643.find().pretty();
업데이트 후 출력 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e9c737f6c954c74be91e6e3"),
"details" : [
{
"CountryName" : "US",
"StudentDetails" : [
{
"Name" : "Chris"
},
{
"SubjectName" : "MySQL"
}
]
},
{
"CountryName" : "UK",
"StudentDetails" : [
{
"Name" : "Bob"
},
{
"SubjectName" : "Java"
},
{
"Marks" : 78
}
]
}
]
}출력 결과를 보면 "UK" 항목의 StudentDetails 배열에 {Marks: 78} 객체가 성공적으로 추가된 것을 확인할 수 있습니다. 이처럼 update() 메서드와 positional($) 연산자를 조합하면, 배열 내부에 중첩된 문서도 간단하게 수정할 수 있습니다.