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

MongoDB에서 $project로 내장 문서의 isMarried 상태 조회하기

MongoDB에서 내장 문서의 isMarried 값 추출하기

MongoDB 컬렉션에 저장된 문서 안에는 다른 문서가 중첩된 형태의 내장(embedded) 문서가 포함될 수 있습니다. 이렇게 중첩된 문서에서 특정 필드만 골라서 조회하고 싶다면 집계(aggregate) 파이프라인의 $project 연산자를 활용하면 됩니다.

이번 글에서는 내장 문서에 포함된 "isMarried" 값을 모두 가져오는 방법을 예제와 함께 살펴보겠습니다.

1. 예제 컬렉션 생성 및 문서 삽입

먼저 테스트용 컬렉션을 만들고 문서 두 개를 삽입하겠습니다. 각 문서는 details라는 내장 문서를 가지고 있으며, 그 안에 isMarried 필드가 포함되어 있습니다.

> db.demo220.insertOne({
...   "id":101,
...   "FullName" : "John Doe",
...   "EmailId" : "john12@gmail.com",
...   "ShippingDate" : new ISODate(),
...   "details" : { "_id" :1001, "isMarried" :true }
...}
...);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3eaf5b03d395bdc213471d")
}
> db.demo220.insertOne(
...{
...   "id":102,
...   "FullName" : "John Smith",
...   "EmailId" : "johnsmith@gmail.com",
...   "ShippingDate" : new ISODate(),
...   "details" : { "_id" :1002, "isMarried" :false }
... }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3eaf5c03d395bdc213471e")
}

2. find()로 전체 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.

> db.demo220.find();

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

{ "_id" : ObjectId("5e3eaf5b03d395bdc213471d"), "id" : 101, "FullName" : "John Doe", "EmailId" : "john12@gmail.com", "ShippingDate" : ISODate("2020-02-08T12:53:47.876Z"), "details" : { "_id" : 1001, "isMarried" : true } }
{ "_id" : ObjectId("5e3eaf5c03d395bdc213471e"), "id" : 102, "FullName" : "John Smith", "EmailId" : "johnsmith@gmail.com", "ShippingDate" : ISODate("2020-02-08T12:53:48.991Z"), "details" : { "_id" : 1002, "isMarried" : false } }

3. $project로 내장 문서의 isMarried 값 가져오기

내장 문서의 특정 필드만 추출하려면 점 표기법(dot notation)으로 경로를 지정한 뒤 $project 단계에서 새로운 필드 이름에 매핑하면 됩니다. 아래 쿼리는 details.isMarried 값을 isMarried라는 최상위 필드로 프로젝션합니다.

> db.demo220.aggregate({ $project : {
...   "isMarried" : "$details.isMarried",
...   "detailsId" : "$details_id"} });

쿼리 실행 결과는 다음과 같습니다. 각 문서의 _id와 함께 내장 문서에 포함된 isMarried 값만 깔끔하게 출력되는 것을 확인할 수 있습니다.

{ "_id" : ObjectId("5e3eaf5b03d395bdc213471d"), "isMarried" : true }
{ "_id" : ObjectId("5e3eaf5c03d395bdc213471e"), "isMarried" : false }

정리

$project는 지정한 필드만 남기고 나머지는 제외하는 프로젝션 단계입니다. "$details.isMarried"처럼 점 표기법을 사용하면 중첩된 내장 문서의 값도 손쉽게 추출할 수 있으며, 이를 통해 대량의 데이터에서 필요한 정보만 효율적으로 조회할 수 있습니다.