$facet (aggregation)
정의
$facet
동일한 입력 문서 세트의 단일 단계 내에서 여러 집계 파이프라인 을 처리합니다. 각 하위 파이프라인에는 출력 문서에 자체 필드가 있으며, 이 필드에서 결과는 문서 배열로 저장됩니다.
$facet
단계를 사용하면 단일 애그리게이션 단계 내에서 여러 차원 또는 패싯의 데이터를 특성화하는 다면적 애그리게이션을 생성할 수 있습니다. 다면적 패싯 애그리게이션은 데이터 탐색 및 분석을 안내하는 여러 필터와 분류를 제공합니다. 소매업체는 일반적으로 패싯을 사용하여 제품 가격, 제조업체, 크기 등에 대한 필터를 만들어 검색 결과의 범위를 좁힙니다.입력 문서는 한 번만
$facet
단계로 전달됩니다.$facet
를 사용하면 입력 문서를 여러 번 검색할 필요 없이 동일한 입력 문서 집합에 대해 다양한 집계를 얻을 수 있습니다.
호환성
다음 환경에서 호스팅되는 배포에 $facet
사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
$facet
단계의 형식은 다음과 같습니다.
{ $facet: { <outputField1>: [ <stage1>, <stage2>, ... ], <outputField2>: [ <stage1>, <stage2>, ... ], ... } }
지정된 파이프라인 각각의 출력 필드 이름을 지정합니다.
고려 사항
$facet
의 각 단계가 실행될 때마다 결과 문서는 100메가바이트로 제한됩니다. $facet
은 디스크로 유출될 수 없으므로 allowDiskUse 플래그는 100메가바이트 크기 제한에 영향을 주지 않습니다.
최종 출력 문서에는 16메가바이트 BSON 문서 크기 제한이 적용됩니다. 16메가바이트를 초과하면 애그리게이션에서 오류가 발생합니다.
팁
다음도 참조하세요.
행동
패싯과 관련된 애그리게이션 단계에서는 수신 문서를 분류하고 그룹화합니다. 다양한 $facet
하위 파이프라인의 <stage>
에 다음과 같은 패싯 관련 단계를 지정해 다면적 애그리게이션을 수행할 수 있습니다.
다른 애그리게이션 단계도 $facet
과 함께 사용할 수 있지만 다음과 같은 예외가 있습니다.
$facet
내의 각 하위 파이프라인에는 정확히 동일한 입력 문서 집합이 전달됩니다. 이러한 하위 파이프라인은 서로 완전히 독립적이며 각 하위 파이프라인의 문서 배열 출력은 출력 문서의 별도 필드에 저장됩니다. 한 하위 파이프라인의 출력은 동일한 $facet
단계 내에서 다른 하위 파이프라인의 입력으로 사용할 수 없습니다. 추가 애그리게이션이 필요한 경우 $facet
뒤에 단계를 추가하고 원하는 하위 파이프라인 출력의 필드 이름 <outputField>
를 지정합니다.
인덱스 사용하기
파이프라인 순서에 따라 $facet
단계에서 인덱스를 사용하는 방식이 결정됩니다.
$facet
단계가 파이프라인의 첫 번째 단계인 경우 이 단계에서는COLLSCAN
을 수행합니다.$facet
단계가 파이프라인의 첫 번째 단계인 경우에는 인덱스를 사용하지 않습니다.$facet
단계가 파이프라인의 후반부에 있고 이전 단계에서 인덱스를 사용한 경우, 실행 중에$facet
은COLLSCAN
을 트리거하지 않습니다.
예를 들어 $facet
단계 앞에 오는 $match
또는 $sort
단계는 인덱스를 사용할 수 있으며 $facet
은 COLLSCAN
을 트리거하지 않습니다.
최적화 제안 사항은 aggregation pipeline 최적화를 참조하세요.
예제
재고가 다음 artwork
컬렉션에 저장된 온라인 스토어를 가정해 보겠습니다.
{ "_id" : 1, "title" : "The Pillars of Society", "artist" : "Grosz", "year" : 1926, "price" : NumberDecimal("199.99"), "tags" : [ "painting", "satire", "Expressionism", "caricature" ] } { "_id" : 2, "title" : "Melancholy III", "artist" : "Munch", "year" : 1902, "price" : NumberDecimal("280.00"), "tags" : [ "woodcut", "Expressionism" ] } { "_id" : 3, "title" : "Dancer", "artist" : "Miro", "year" : 1925, "price" : NumberDecimal("76.04"), "tags" : [ "oil", "Surrealism", "painting" ] } { "_id" : 4, "title" : "The Great Wave off Kanagawa", "artist" : "Hokusai", "price" : NumberDecimal("167.30"), "tags" : [ "woodblock", "ukiyo-e" ] } { "_id" : 5, "title" : "The Persistence of Memory", "artist" : "Dali", "year" : 1931, "price" : NumberDecimal("483.00"), "tags" : [ "Surrealism", "painting", "oil" ] } { "_id" : 6, "title" : "Composition VII", "artist" : "Kandinsky", "year" : 1913, "price" : NumberDecimal("385.00"), "tags" : [ "oil", "painting", "abstract" ] } { "_id" : 7, "title" : "The Scream", "artist" : "Munch", "year" : 1893, "tags" : [ "Expressionism", "painting", "oil" ] } { "_id" : 8, "title" : "Blue Flower", "artist" : "O'Keefe", "year" : 1918, "price" : NumberDecimal("118.42"), "tags" : [ "abstract", "painting" ] }
다음 작업은 MongoDB의 패싯 기능을 사용하여 태그, 가격, 생성 연도 등 여러 차원으로 분류된 스토어 인벤토리를 고객에게 제공합니다. 이 $facet
단계에는 $sortByCount
, $bucket
, 또는 $bucketAuto
를 사용하여 이 멀티 패싯 애그리게이션를 수행하는 세 개의 하위 파이프라인이 있습니다. artwork
의 입력 문서는 작업 시작 시 데이터베이스에서 단 한 번만 가져옵니다.
db.artwork.aggregate( [ { $facet: { "categorizedByTags": [ { $unwind: "$tags" }, { $sortByCount: "$tags" } ], "categorizedByPrice": [ // Filter out documents without a price e.g., _id: 7 { $match: { price: { $exists: 1 } } }, { $bucket: { groupBy: "$price", boundaries: [ 0, 150, 200, 300, 400 ], default: "Other", output: { "count": { $sum: 1 }, "titles": { $push: "$title" } } } } ], "categorizedByYears(Auto)": [ { $bucketAuto: { groupBy: "$year", buckets: 4 } } ] } } ])
연산은 다음 문서를 반환합니다.
{ "categorizedByYears(Auto)" : [ // First bucket includes the document without a year, e.g., _id: 4 { "_id" : { "min" : null, "max" : 1902 }, "count" : 2 }, { "_id" : { "min" : 1902, "max" : 1918 }, "count" : 2 }, { "_id" : { "min" : 1918, "max" : 1926 }, "count" : 2 }, { "_id" : { "min" : 1926, "max" : 1931 }, "count" : 2 } ], "categorizedByPrice" : [ { "_id" : 0, "count" : 2, "titles" : [ "Dancer", "Blue Flower" ] }, { "_id" : 150, "count" : 2, "titles" : [ "The Pillars of Society", "The Great Wave off Kanagawa" ] }, { "_id" : 200, "count" : 1, "titles" : [ "Melancholy III" ] }, { "_id" : 300, "count" : 1, "titles" : [ "Composition VII" ] }, { // Includes document price outside of bucket boundaries, e.g., _id: 5 "_id" : "Other", "count" : 1, "titles" : [ "The Persistence of Memory" ] } ], "categorizedByTags" : [ { "_id" : "painting", "count" : 6 }, { "_id" : "oil", "count" : 4 }, { "_id" : "Expressionism", "count" : 3 }, { "_id" : "Surrealism", "count" : 2 }, { "_id" : "abstract", "count" : 2 }, { "_id" : "woodblock", "count" : 1 }, { "_id" : "woodcut", "count" : 1 }, { "_id" : "ukiyo-e", "count" : 1 }, { "_id" : "satire", "count" : 1 }, { "_id" : "caricature", "count" : 1 } ] }