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()로 반복 출력하면, 중첩된 하위 문서도 가독성 좋게 한 줄씩 정리할 수 있습니다.