문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/ / /

$facet (aggregation)

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • 고려 사항
  • 행동
  • 예제
$facet

동일한 입력 문서 세트의 단일 단계 내에서 여러 집계 파이프라인 을 처리합니다. 각 하위 파이프라인에는 출력 문서에 자체 필드가 있으며, 이 필드에서 결과는 문서 배열로 저장됩니다.

$facet 단계를 사용하면 단일 애그리게이션 단계 내에서 여러 차원 또는 패싯의 데이터를 특성화하는 다면적 애그리게이션을 생성할 수 있습니다. 다면적 패싯 애그리게이션은 데이터 탐색 및 분석을 안내하는 여러 필터와 분류를 제공합니다. 소매업체는 일반적으로 패싯을 사용하여 제품 가격, 제조업체, 크기 등에 대한 필터를 만들어 검색 결과의 범위를 좁힙니다.

입력 문서는 한 번만 $facet 단계로 전달됩니다. $facet를 사용하면 입력 문서를 여러 번 검색할 필요 없이 동일한 입력 문서 집합에 대해 다양한 집계를 얻을 수 있습니다.

다음 환경에서 호스팅되는 배포에 $facet 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 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 단계가 파이프라인의 후반부에 있고 이전 단계에서 인덱스를 사용한 경우, 실행 중에 $facetCOLLSCAN을 트리거하지 않습니다.

예를 들어 $facet 단계 앞에 오는 $match 또는 $sort 단계는 인덱스를 사용할 수 있으며 $facetCOLLSCAN을 트리거하지 않습니다.

최적화 제안 사항은 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 }
]
}
← $documents (aggregation)