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

MongoDB에서 중첩 객체를 검색하는 방법 ($ 연산자 활용)

MongoDB에서 배열 안에 포함된 중첩 객체(nested object)를 조회하려면 $ 위치 연산자를 사용하면 됩니다. 이 연산자는 쿼리 조건에 일치하는 배열 요소만 반환해 주기 때문에, 복잡한 구조의 문서에서도 원하는 데이터만 효율적으로 추출할 수 있습니다.

1. 샘플 컬렉션 생성 및 문서 삽입

먼저 insertOne() 메서드를 사용해 테스트용 컬렉션을 생성하고 문서를 삽입해 보겠습니다.

> db.queryNestedObject.insertOne(
...    {
...       "StudentName" : "James",
...       "StudentSubjectScore" : [
...          {"StudentMongoDBScore":98},
...          {"StudentCScore":92},
...          {"StudentJavaScore":91}
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ccf49a9dceb9a92e6aa1962")
}

2. 전체 문서 확인하기

find() 메서드와 pretty() 메서드를 함께 사용하면 컬렉션의 모든 문서를 보기 좋은 형태로 출력할 수 있습니다.

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

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5ccf49a9dceb9a92e6aa1962"),
   "StudentName" : "James",
   "StudentSubjectScore" : [
      {
         "StudentMongoDBScore" : 98
      },
      {
         "StudentCScore" : 92
      },
      {
         "StudentJavaScore" : 91
      }
   ]
}

3. 중첩 객체 조회 쿼리 실행

이제 $ 연산자를 사용해 특정 조건에 맞는 중첩 객체만 조회해 보겠습니다. 아래 예제는 StudentJavaScore 값이 91인 배열 요소만 반환합니다.

> db.queryNestedObject.find({'StudentSubjectScore.StudentJavaScore' : 91},{'StudentSubjectScore.$': 1 , _id: 0});

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

{ "StudentSubjectScore" : [ { "StudentJavaScore" : 91 } ] }

쿼리 동작 방식 살펴보기

  • 'StudentSubjectScore.StudentJavaScore' : 91 — 점 표기법(dot notation)으로 배열 내부의 중첩 필드를 탐색하여 값이 91인 요소를 찾습니다.
  • 'StudentSubjectScore.$' : 1 — $ 위치 연산자가 조건에 일치하는 첫 번째 배열 요소만 프로젝션하여 반환합니다.
  • _id : 0 — 기본적으로 함께 반환되는 _id 필드를 결과에서 제외합니다.

이처럼 MongoDB의 $ 연산자를 활용하면 배열 형태로 저장된 중첩 객체 중에서 원하는 데이터만 간단하고 정확하게 추출할 수 있습니다.