$facet (집계)
정의
$facet
버전 3.4에 새로 추가되었습니다.
동일한 입력 문서 세트에 대해 단일 단계에서 여러 개의 집계 파이프라인을 처리합니다. 각 하위 파이프라인에는 출력 문서에 자체 필드가 있으며, 여기서 결과는 문서 배열로 저장됩니다.
$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
을 트리거하지 않습니다.
최적화 제안 사항은 집계 파이프라인 최적화를 참조하세요.
예시
재고가 다음 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 } ] }