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

MongoDB에서 점(.) 표기법으로 하위 문서 조작하는 방법

MongoDB에서 하위 문서 조작하기

MongoDB에서 배열 안에 포함된 하위 문서(subdocument)를 조작하려면 점(.) 표기법을 사용해야 합니다. 이 표기법을 활용하면 배열 내 특정 요소의 필드에 정확하게 접근하여 값을 수정할 수 있습니다. 이번 글에서는 실제 예제를 통해 하위 문서를 생성하고, 조회하고, 업데이트하는 과정을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성

먼저 insertOne() 메서드를 사용하여 문서가 담긴 컬렉션을 생성합니다. 이 예제에서는 details라는 배열 필드 안에 두 개의 하위 문서를 포함시킵니다.

> db.demo378.insertOne(
...    {
...       Name: 'Chris',
...       details:[
...          {id:101,Score:56},
...          {id:102,Score:78}
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5a758a2ae06a1609a00b0f")
}

2. 저장된 문서 확인

find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.

> db.demo378.find();

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

{
   "_id" : ObjectId("5e5a758a2ae06a1609a00b0f"), "Name" : "Chris", "details" : [
      { "id" : 101, "Score" : 56 }, { "id" : 102, "Score" : 78 }
   ]
}

3. 하위 문서 업데이트 쿼리 실행

이제 점(.) 표기법과 위치 연산자($)를 조합하여 하위 문서를 조작하는 쿼리를 실행해 보겠습니다. 아래 쿼리는 Name이 "Chris"이면서 details 배열 중 id가 102인 요소를 찾아, $inc 연산자로 Score 값을 8만큼 감소시킵니다.

> db.demo378.update({Name: "Chris", "details.id":102 }, { $inc: { "details.$.Score": -8 } });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

여기서 핵심은 "details.$.Score" 부분입니다. 위치 연산자($)는 쿼리 조건과 일치하는 배열 요소의 인덱스를 자동으로 참조하므로, 일치한 해당 요소의 Score 필드만 정확히 수정됩니다.

4. 업데이트 결과 확인

다시 find() 메서드로 전체 문서를 조회하여 변경 사항을 확인합니다.

> db.demo378.find();

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

{
   "_id" : ObjectId("5e5a758a2ae06a1609a00b0f"), "Name" : "Chris", "details" : [
      { "id" : 101, "Score" : 56 }, { "id" : 102, "Score" : 70 }
   ]
}

출력 결과를 보면 id가 102인 하위 문서의 Score 값이 78에서 70으로 8 감소한 것을 확인할 수 있습니다. 반면 id가 101인 요소는 조건에 해당하지 않으므로 그대로 56을 유지하고 있습니다.

핵심 개념 정리

MongoDB에서 하위 문서를 조작할 때 기억해야 할 핵심 요소는 다음과 같습니다.

  • 점(.) 표기법: "배열필드명.조건필드명" 형태로 작성하여 배열 내부 요소를 검색 조건에 지정합니다.
  • 위치 연산자($): 쿼리 조건과 일치한 첫 번째 배열 요소를 가리키며, 해당 요소만 선택적으로 업데이트합니다.
  • $inc 연산자: 기존 값을 기준으로 더하거나 빼는 증감 연산을 수행합니다. 음수를 지정하면 값이 감소합니다.

참고로 위 예제에서 사용된 update() 메서드는 구버전 방식으로, 최신 MongoDB 버전에서는 용도에 따라 updateOne(), updateMany(), replaceOne() 메서드 사용이 권장됩니다. 동작 원리는 동일하므로 점 표기법과 위치 연산자를 조합하는 패턴은 그대로 적용할 수 있습니다.