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

MongoDB에서 중첩된 내장 문서(Nested Embedded Documents) 업데이트하는 방법

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($) 연산자를 조합하면, 배열 내부에 중첩된 문서도 간단하게 수정할 수 있습니다.