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

MongoDB find() 쿼리로 중첩(Nested) 문서 조회하기

MongoDB에서 중첩(nested) 문서나 배열 내부의 필드 값을 조회하려면 점 표기법(dot notation)을 사용해야 합니다. 이 글에서는 실제 예제를 통해 중첩 문서를 find() 쿼리로 검색하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성

먼저 중첩 구조를 포함한 문서들을 담은 컬렉션을 생성합니다. 아래 예제에서는 'details'라는 배열 필드 안에 이메일과 국가 정보가 중첩되어 있습니다.

> db.demo591.insert([
...     { "Name": "John", "Age": 23 },
...     { "Name": "Carol", "Age": 26 },
...     { "Name": "Robert", "Age": 29,
...       details: [
...           {
...               Email: "Robert@gmail.com", CountryName: "US"
...           },
...           { "Post": 35 }
...       ]
...     }
... ]);
BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 3,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
})

실행 결과 3개의 문서가 정상적으로 삽입된 것을 확인할 수 있습니다(nInserted: 3).

2. find() 메서드로 전체 문서 확인

find() 메서드에 조건 없이 호출하면 컬렉션의 모든 문서를 출력합니다.

> db.demo591.find();

위 쿼리는 다음과 같은 결과를 반환합니다.

{ "_id" : ObjectId("5e92dd08fd2d90c177b5bcd3"), "Name" : "John", "Age" : 23 }
{ "_id" : ObjectId("5e92dd08fd2d90c177b5bcd4"), "Name" : "Carol", "Age" : 26 }
{ "_id" : ObjectId("5e92dd08fd2d90c177b5bcd5"), "Name" : "Robert", "Age" : 29, "details" : [ {
"Email" : "Robert@gmail.com", "CountryName" : "US" }, { "Post" : 35 } ] }

3. 점 표기법으로 중첩 문서 조회

이제 핵심 부분입니다. 배열 안에 있는 'Email' 필드 값을 기준으로 문서를 조회하려면 "details.Email"처럼 상위 필드와 하위 필드를 마침표(.)로 연결한 점 표기법을 쿼리 조건에 사용합니다.

> db.demo591.find({"details.Email": "Robert@gmail.com"});

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

{ "_id" : ObjectId("5e92dd08fd2d90c177b5bcd5"), "Name" : "Robert", "Age" : 29, "details" : [
    { "Email" : "Robert@gmail.com", "CountryName" : "US" }, { "Post" : 35 } 
] }

정리

MongoDB는 배열 내부의 객체 필드도 일반적인 경로처럼 다룰 수 있어 매우 편리합니다. 즉, 'details' 배열 안의 어떤 요소든 'Email' 값이 조건과 일치하기만 하면 해당 문서 전체가 조회됩니다. 이러한 점 표기법은 중첩 문서뿐 아니라 배열 인덱스(예: "details.0.Email")에 접근할 때도 동일하게 활용할 수 있으므로, 복잡한 데이터 구조를 다룰 때 반드시 익혀두어야 할 핵심 개념입니다.