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

MongoDB에서 하위 문서(Subdocument)를 쿼리해 한 줄로 출력하는 방법

MongoDB 하위 문서를 한 줄에 출력하기

배열 형태의 하위 문서(subdocument)를 한 줄씩 표시하려면 $unwind 연산자와 aggregate() 메서드를 함께 사용하면 됩니다. $unwind는 배열 안의 각 요소를 개별 문서로 분리해 주기 때문에, 반복 처리를 통해 원하는 형식으로 손쉽게 출력할 수 있습니다.

먼저 예제용 컬렉션을 생성하고 문서를 삽입해 보겠습니다.

> db.demo183.insertOne(
... {
...   "_id": "110",
...   "DueDate": ISODate("2020-02-04T01:10:42.000Z"),
...   "ProductDetails": [
...      {
...          "ProductName": "Product-1",
...          "isAvailable": true
...      },
...      {
...          "ProductName": "Product-2",
...          "isAvailable": false
...      }
...   ]
...   }
...);
{ "acknowledged" : true, "insertedId" : "110" }

삽입된 문서 확인하기

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

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

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : "110",
   "DueDate" : ISODate("2020-02-04T01:10:42Z"),
   "ProductDetails" : [
      {
         "ProductName" : "Product-1",
         "isAvailable" : true
      },
      {
         "ProductName" : "Product-2",
         "isAvailable" : false
      }
   ]
}

$unwind로 하위 문서를 한 줄씩 출력하기

아래는 aggregate() 파이프라인에서 $match로 특정 문서를 필터링한 뒤, $unwind로 ProductDetails 배열을 개별 문서로 펼쳐서 한 줄씩 출력하는 방법입니다.

> var productdata = function (d) {
...   print(d.DueDate+", " + d.ProductDetails.ProductName + ", " + d.ProductDetails.isAvailable);
... }
> var iterator = db.demo183.aggregate([
...   {$match: {_id: "110"}},
...   {$unwind: '$ProductDetails'}
... ]);
> iterator.forEach(productdata );

실행 결과는 다음과 같습니다. 배열의 각 요소가 하나의 레코드처럼 한 줄에 나란히 출력되는 것을 확인할 수 있습니다.

Tue Feb 04 2020 06:40:42 GMT+0530 (India Standard Time), Product-1, true
Tue Feb 04 2020 06:40:42 GMT+0530 (India Standard Time), Product-2, false

이처럼 $match로 대상 문서를 좁히고 $unwind로 배열을 분리한 후 forEach()로 반복 출력하면, 중첩된 하위 문서도 가독성 좋게 한 줄씩 정리할 수 있습니다.