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

MongoDB 문서 배열에 새 요소 추가하기 – 위치 연산자($)와 update() 활용법

MongoDB 문서의 배열 안에 새로운 요소(필드)를 추가하려면 위치 연산자($)를 update() 메서드와 함께 사용하면 됩니다. 위치 연산자는 쿼리 조건과 일치하는 배열 요소를 자동으로 식별해 주기 때문에, 인덱스 번호를 직접 지정하지 않고도 해당 요소만 정확하게 수정할 수 있습니다.


아래 예제를 통해 실제 동작 과정을 단계별로 살펴보겠습니다.

1단계: 컬렉션 생성 및 문서 삽입

먼저 insertOne() 메서드를 사용해 샘플 컬렉션을 만들고 문서를 삽입합니다.

> db.demo222.insertOne({"details":[{"StudentName":"Chris","StudentMarks":78},{"StudentName":"David","StudentMarks":89}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3ee31703d395bdc213472f")
}

2단계: 문서 확인

find() 메서드로 컬렉션의 모든 문서를 조회합니다.

> db.demo222.find().pretty();

실행 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5e3ee31703d395bdc213472f"),
   "details" : [
      {
         "StudentName" : "Chris",
         "StudentMarks" : 78
      },
      {
         "StudentName" : "David",
         "StudentMarks" : 89
      }
   ]
}

3단계: 위치 연산자($)로 새 필드 추가

이제 update() 메서드와 $ 연산자를 사용해 특정 학생의 배열 요소에 새로운 필드를 추가합니다.

> db.demo222.update({"details.StudentName" : "Chris"},{"$set" : {"details.$.SubjectName":"MongoDB"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

여기서 "details.$"는 쿼리 조건(StudentName이 "Chris")과 일치하는 배열 요소를 가리킵니다. 따라서 Chris 항목에만 SubjectName 필드가 새롭게 추가되고, 나머지 요소는 그대로 유지됩니다.

4단계: 업데이트 결과 확인

다시 find() 메서드로 변경된 문서를 확인합니다.

> db.demo222.find().pretty();

결과를 보면 StudentName이 "Chris"인 요소에만 SubjectName 필드가 추가된 것을 알 수 있습니다.

{
   "_id" : ObjectId("5e3ee31703d395bdc213472f"),
   "details" : [
      {
         "StudentName" : "Chris",
         "StudentMarks" : 78,
         "SubjectName" : "MongoDB"
      },
      {
         "StudentName" : "David",
         "StudentMarks" : 89
      }
   ]
}

추가 참고 사항

최신 MongoDB 버전(4.2 이상)에서는 update() 대신 updateOne(), updateMany() 메서드 사용이 권장됩니다. 또한 여러 배열 요소를 한 번에 수정해야 하는 경우에는 전체 위치 연산자($[])나 arrayFilters 옵션을 활용하면 더욱 유연한 업데이트가 가능합니다.