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

MongoDB에서 내장 문서(Embedded Document)를 쿼리하는 방법

MongoDB에서 배열 형태로 저장된 내장 문서(Embedded Document)를 조건에 맞게 조회하려면 aggregate() 메서드를 사용하는 것이 효과적입니다. 이 글에서는 예제 컬렉션을 만들고, $unwind와 $match 파이프라인 단계를 활용해 내장 문서를 필터링하는 과정을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 insertOne() 메서드를 사용하여 내장 문서 배열을 포함한 도큐먼트를 컬렉션에 삽입합니다.

> db.demo705.insertOne(
...     {
...        _id:101,
...        "Information":
...        [
...           {
...              "StudentName":"Chris",
...              "StudentAge":21
...           },
...           {
...              "StudentName":"David",
...              "StudentAge":23
...           },
...           {
...              "StudentName":"Bob",
...              "StudentAge":20
...           }
...        ]
...     }
... );
{ "acknowledged" : true, "insertedId" : 101 }

삽입이 성공적으로 완료되면 위와 같이 insertedId가 반환됩니다.

2. find()로 전체 도큐먼트 확인하기

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

> db.demo705.find();

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

{ "_id" : 101, "Information" : [ { "StudentName" : "Chris", "StudentAge" : 21 }, { "StudentName" : "David", "StudentAge" : 23 }, { "StudentName" : "Bob", "StudentAge" : 20 } ] }

3. aggregate()로 내장 문서 쿼리하기

배열 안의 각 내장 문서를 개별 도큐먼트처럼 다루려면 먼저 $unwind로 배열을 분해하고, $match로 조건을 걸어준 뒤, $project로 필요한 필드만 출력하면 됩니다.

아래 예제는 StudentAge가 21 이상인 학생 정보만 조회하는 쿼리입니다.

> db.demo705.aggregate(
...    { $unwind: '$Information' },
...    { $match: {'Information.StudentAge': {$gte: 21}}},
...    { $project: {Information: 1}}
... )

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

{ "_id" : 101, "Information" : { "StudentName" : "Chris", "StudentAge" : 21 } }
{ "_id" : 101, "Information" : { "StudentName" : "David", "StudentAge" : 23 } }

정리

aggregate() 파이프라인에서 $unwind는 Information 배열의 요소들을 각각 별도의 도큐먼트로 펼쳐주고, $match는 StudentAge가 21 이상($gte)인 문서만 남깁니다. 그 결과 나이가 20세인 Bob은 제외되고 Chris(21세)와 David(23세)의 정보만 출력되는 것을 확인할 수 있습니다. 이처럼 $unwind → $match → $project 순서의 파이프라인 구성은 MongoDB에서 내장 문서를 유연하게 필터링할 때 가장 널리 쓰이는 패턴입니다.