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