정의
facet
facet
수집기는 지정된 패싯 필드의 값 또는 범위별로 결과를 그룹화하고 해당 그룹 각각의 개수를 반환합니다.및
$searchMeta
단계$search
모두에서 을 사용할 수 있습니다.facet
MongoDB 를 단계와 함께 사용하여facet
$searchMeta
쿼리 에 대한 메타데이터 결과만 조회 것을 권장합니다. 단계를$search
사용하여 메타데이터 결과 및 쿼리 결과를 조회 하려면$$SEARCH_META
집계 변수를 사용해야 합니다.SEARCH_META
자세한 학습 은 애그리게이션 변수를 참조하세요.
구문
facet
의 구문은 다음과 같습니다:
{ "$searchMeta"|"$search": { "index": <index name>, // optional, defaults to "default" "facet": { "operator": { <operator-specifications> }, "facets": { <facet-definitions> } } } }
필드
패싯 정의
패싯 정의 문서 에는 패싯 이름과 패싯 유형별 옵션이 포함되어 있습니다. MongoDB Search는 다음 유형의 패싯을 지원합니다.
문자열 패싯
중요
stringFacet은 더 이상 사용되지 않습니다. 토큰을 대신 사용하세요.
문자열 패싯을 사용하면 지정된 문자열 필드 에서 가장 빈번한 문자열 값을 기반으로 MongoDB Search 결과의 범위를 좁힐 수 있습니다. 문자열 필드 토큰으로 인덱싱되어야 합니다. 내장된 문서의 문자열 필드를 패싯 하려면 상위 필드도 문서 유형으로 인덱스 해야 합니다. 배열이나 내장된 문서의 문자열을 패싯 경우 MongoDB Search는 일치하는 루트 문서 수를 기준으로 패싯 수를 반환합니다.
구문
문자열 패싯의 구문은 다음과 같습니다:
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "string", "path" : "<field-path>", "numBuckets" : <number-of-categories>, } } } } }
옵션
옵션 | 유형 | 설명 | 필수 사항입니다. |
---|---|---|---|
| int | 결과에 반환할 패싯 카테고리의 최대 개수입니다. 값은 | no |
| 문자열 | 패싯을 설정할 필드 경로입니다. 토큰으로 인덱싱되는 필드를 지정할 수 있습니다. | 네 |
| 문자열 | 패싯의 유형입니다. 값은 | 네 |
예시
예시
다음 예시는 sample_mflix.movies
컬렉션의 default
라는 인덱스를 사용합니다. 컬렉션의 genres
필드는 토큰 유형으로 인덱싱되고 year
필드는 숫자 유형으로 인덱싱됩니다.
{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "token" }, "year": { "type": "number" } } } }
이 쿼리는 $searchMeta
단계를 사용하여 movies
컬렉션의 year
필드에서 2000년부터 2015년까지의 영화를 검색하고 각 장르의 영화 수 개수를 검색합니다.
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "range": { 7 "path": "year", 8 "gte": 2000, 9 "lte": 2015 10 } 11 }, 12 "facets": { 13 "genresFacet": { 14 "type": "string", 15 "path": "genres" 16 } 17 } 18 } 19 } 20 } 21 ])
1 [ 2 { 3 count: { lowerBound: Long('12568') }, 4 facet: { 5 genresFacet: { 6 buckets: [ 7 { _id: 'Drama', count: Long('7079') }, 8 { _id: 'Comedy', count: Long('3689') }, 9 { _id: 'Romance', count: Long('1764') }, 10 { _id: 'Thriller', count: Long('1584') }, 11 { _id: 'Documentary', count: Long('1472') }, 12 { _id: 'Action', count: Long('1471') }, 13 { _id: 'Crime', count: Long('1367') }, 14 { _id: 'Adventure', count: Long('1056') }, 15 { _id: 'Horror', count: Long('866') }, 16 { _id: 'Biography', count: Long('796') } 17 ] 18 } 19 } 20 } 21 ]
이러한 결과에 대해 자세히 알아보려면 패싯 결과를 참조하세요.
숫자 패싯
중요
numberFacet은 더 이상 사용되지 않습니다. 대신 number를 사용하세요.
숫자 패싯을 사용하면 결과를 별도의 숫자 범위로 나누어 검색 결과에서 숫자 값의 빈도를 결정할 수 있습니다. 배열이나 내장된 문서의 숫자를 패싯 경우 MongoDB Search는 일치하는 루트 문서 수를 기준으로 패싯 수를 반환합니다.
구문
숫자 패싯의 구문은 다음과 같습니다:
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "number", "path" : "<field-path>", "boundaries" : <array-of-numbers>, "default": "<bucket-name>" } } } } }
옵션
옵션 | 유형 | 설명 | 필수 사항입니다. |
---|---|---|---|
| 숫자 배열 | 각 버킷의 경계를 지정하는 숫자 값의 오름차순 목록입니다. 천 이하인 경계를 두 개 이상 지정해야 합니다(
| 네 |
| 문자열 | 지정된 경계에 속하지 않는 연산자 로부터 반환된 문서를 계산하는 추가 버킷의 이름입니다. 생략하면 MongoDB Search는 지정된 버킷에 속하지 않는 패싯 연산자 의 결과도 포함하지만 버킷 수에는 포함하지 않습니다. | no |
| 문자열 | 패싯을 설정할 필드 경로입니다. number 유형으로 인덱싱되는 필드를 지정할 수 있습니다. | 네 |
| 문자열 | 패싯의 유형입니다. 값은 | 네 |
예시
예시
다음 예시는 sample_mflix.movies
컬렉션의 default
라는 인덱스를 사용합니다. 컬렉션의 year
필드는 number 유형으로 인덱싱됩니다.
{ "mappings": { "dynamic": false, "fields": { "year": [ { "type": "number" } ] } } }
이 쿼리는 $searchMeta
단계를 사용하여 movies
컬렉션의 year
필드에서 1980
년부터 2000
년 사이의 영화를 검색하고 쿼리에 대한 메타데이터 결과를 검색합니다. 쿼리는 3개의 버킷을 지정합니다.
1980
이 버킷에 대한 포괄적인 하한값1990
1980
버킷에 대한 배타적 상한과 이 버킷에 대한 포괄적 하한입니다.2000
1990
버킷에 대한 배타적 상한
이 쿼리는 또한 지정된 경계에 속하지 않는 쿼리 결과를 검색하기 위해 other
이라는 이름의 default
버킷을 지정합니다.
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "range": { 7 "path": "year", 8 "gte": 1980, 9 "lte": 2000 10 } 11 }, 12 "facets": { 13 "yearFacet": { 14 "type": "number", 15 "path": "year", 16 "boundaries": [1980,1990,2000], 17 "default": "other" 18 } 19 } 20 } 21 } 22 } 23 ])
1 [ 2 { 3 count: { lowerBound: Long('6095') }, 4 facet: { 5 yearFacet: { 6 buckets: [ 7 { _id: 1980, count: Long('1956') }, 8 { _id: 1990, count: Long('3558') }, 9 { _id: 'other', count: Long('581') } 10 ] 11 } 12 } 13 } 14 ]
이러한 결과에 대해 자세히 알아보려면 패싯 결과를 참조하세요.
날짜 패싯
날짜 패싯을 사용하면 날짜를 기준으로 검색 결과의 범위를 좁힐 수 있습니다. 배열이나 내장된 문서의 날짜를 패싯 경우 MongoDB Search는 일치하는 루트 문서 수를 기준으로 패싯 수를 반환합니다.
구문
날짜 패싯의 구문은 다음과 같습니다:
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "date", "path" : "<field-path>", "boundaries" : <array-of-dates>, "default": "<bucket-name>" } } } } }
옵션
옵션 | 유형 | 설명 | 필수 사항입니다. |
---|---|---|---|
| 숫자 배열 | 각 버킷의 경계를 지정하는 날짜 값 목록입니다. 다음을 지정해야 합니다:
각 인접한 값 쌍은 버킷의 포괄적인 하한과 배타적인 상한으로 작용합니다. | 네 |
| 문자열 | 지정된 경계에 속하지 않는 연산자 로부터 반환된 문서를 계산하는 추가 버킷의 이름입니다. 생략하면 MongoDB Search는 지정된 버킷에 속하지 않는 패싯 연산자 의 결과도 포함하지만, MongoDB 수에는 이러한 결과가 포함되지 않습니다. | no |
| 문자열 | 패싯을 설정할 필드 경로입니다. date 유형으로 인덱싱된 필드를 지정할 수 있습니다. | 네 |
| 문자열 | 패싯의 유형입니다. 값은 | 네 |
예시
예시
다음 예시는 sample_mflix.movies
컬렉션의 default
라는 인덱스를 사용합니다. 컬렉션의 released
필드는 date 유형으로 인덱싱됩니다.
{ "mappings": { "dynamic": false, "fields": { "released": [ { "type": "date" } ] } } }
이 쿼리는 $searchMeta
단계를 사용하여 movies
컬렉션의 released
필드에서 2000
년부터2015
사이의 영화를 검색하고 쿼리 문자열에 대한 메타데이터 결과를 검색합니다. 쿼리는 4개의 버킷을 지정합니다:
2000-01-01
이 버킷에 대한 포괄적인 하한값2005-01-01
2000-01-01
버킷에 대한 배타적 상한과 이 버킷에 대한 포괄적 하한입니다.2010-01-01
2005-01-01
버킷에 대한 배타적 상한과 이 버킷에 대한 포괄적 하한입니다.2015-01-01
2010-01-01
버킷에 대한 배타적 상한
이 쿼리는 또한 지정된 경계에 속하지 않는 쿼리 결과를 검색하기 위해 other
이라는 이름의 default
버킷을 지정합니다.
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "range": { 7 "path": "released", 8 "gte": ISODate("2000-01-01T00:00:00.000Z"), 9 "lte": ISODate("2015-01-31T00:00:00.000Z") 10 } 11 }, 12 "facets": { 13 "yearFacet": { 14 "type": "date", 15 "path": "released", 16 "boundaries": [ISODate("2000-01-01"), ISODate("2005-01-01"), ISODate("2010-01-01"), ISODate("2015-01-01")], 17 "default": "other" 18 } 19 } 20 } 21 } 22 } 23 ])
1 [ 2 { 3 count: { lowerBound: Long('11922') }, 4 facet: { 5 yearFacet: { 6 buckets: [ 7 { 8 _id: ISODate('2000-01-01T00:00:00.000Z'), 9 count: Long('3028') 10 }, 11 { 12 _id: ISODate('2005-01-01T00:00:00.000Z'), 13 count: Long('3953') 14 }, 15 { 16 _id: ISODate('2010-01-01T00:00:00.000Z'), 17 count: Long('4832') 18 }, 19 { _id: 'other', count: Long('109') } 20 ] 21 } 22 } 23 } 24 ]
이러한 결과에 대해 자세히 알아보려면 패싯 결과를 참조하세요.
패싯 결과
패싯 쿼리 의 경우 MongoDB Search는 정의된 패싯 이름을 결과의 해당 패싯 에 대한 버킷 배열 에 매핑합니다. 패싯 결과 문서 에는 패싯 에 대한 결과 버킷의 배열 인 buckets
옵션이 포함되어 있습니다. 배열 의 각 패싯 버킷 문서 에는 다음과 같은 필드가 있습니다.
옵션 | 유형 | 설명 |
---|---|---|
| 객체 | 이 패싯 버킷을 식별하는 고유 식별자입니다. 이 값은 패싯 처리되는 데이터 형식과 일치합니다. |
| int | 이 패싯 버킷에 있는 문서 수입니다. |
SEARCH_META
집계 변수
$search
단계를 사용하여 쿼리 실행 MongoDB Search는 메타데이터 결과를 $$SEARCH_META
변수에 저장하고 검색 결과만 반환합니다. 지원되는 모든 집계 파이프라인 단계 에서 $$SEARCH_META
변수를 사용하여 $search
쿼리에 대한 메타데이터 결과를 볼 수 있습니다.
MongoDB는 검색 결과와 메타데이터 결과가 모두 필요한 경우에만 $$SEARCH_META
변수를 사용할 것을 권장합니다. 해당 경우가 아니면 다음을 사용하세요.
$search
검색 결과만 표시하는 단계.$searchMeta
메타데이터 결과만 표시하는 단계.
제한 사항
다음과 같은 제한 사항이 적용됩니다:
단일 필드에 대해서만 패싯 쿼리를 실행할 수 있습니다. 필드 그룹에 대해서는 패싯 쿼리를 실행할 수 없습니다.
클러스터의 샤딩된 컬렉션에 대해서는 패싯 쿼리를 실행 수 없습니다.
예시
다음 예시에서는 sample_mflix.movies
컬렉션을 사용합니다. 메타데이터 결과 예시에서는 facet
을 사용하여 $searchMeta
쿼리를 실행해 결과에서 메타데이터만 조회하는 방법을 보여 줍니다. 메타데이터 및 검색 결과 예시에서는 facet
및 $SEARCH_META
집계 변수를 사용하여 $search
쿼리를 실행해 검색 및 메타데이터 결과를 모두 조회하는 방법을 보여 줍니다.
인덱스 정의는 인덱싱할 필드에 대해 다음을 지정합니다.
{ "mappings": { "dynamic": false, "fields": { "directors": { "type": "token" }, "year": { "type": "number" }, "released": { "type": "date" } } } }
다음 쿼리는 2000년 1월 1일부터 2015년 1월 31일 사이에 개봉한 영화를 검색합니다. directors
, year
필드에 대한 메타데이터를 요청합니다.
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "range": { 7 "path": "released", 8 "gte": ISODate("2000-01-01T00:00:00.000Z"), 9 "lte": ISODate("2015-01-31T00:00:00.000Z") 10 } 11 }, 12 "facets": { 13 "directorsFacet": { 14 "type": "string", 15 "path": "directors", 16 "numBuckets" : 7 17 }, 18 "yearFacet" : { 19 "type" : "number", 20 "path" : "year", 21 "boundaries" : [2000,2005,2010, 2015] 22 } 23 } 24 } 25 } 26 } 27 ])
1 [ 2 { 3 count: { lowerBound: Long('11922') }, 4 facet: { 5 yearFacet: { 6 buckets: [ 7 { _id: 2000, count: Long('3064') }, 8 { _id: 2005, count: Long('4035') }, 9 { _id: 2010, count: Long('4553') } 10 ] 11 }, 12 directorsFacet: { 13 buckets: [ 14 { _id: 'Takashi Miike', count: Long('26') }, 15 { _id: 'Johnnie To', count: Long('20') }, 16 { _id: 'Steven Soderbergh', count: Long('18') }, 17 { _id: 'Michael Winterbottom', count: Long('16') }, 18 { _id: 'Ridley Scott', count: Long('15') }, 19 { _id: 'Tyler Perry', count: Long('15') }, 20 { _id: 'Clint Eastwood', count: Long('14') } 21 ] 22 } 23 } 24 } 25 ]
결과는 sample_mflix.movies
컬렉션에 있는 다음과 같은 것들의 개수를 표시합니다.
2000년(하한 포함)부터 2015(상한 제외)까지 MongoDB Search가 쿼리 에 대해 반환한 영화 수
MongoDB Search가 쿼리 에 대해 반환한 각 감독의 영화 수
인덱스 정의는 인덱싱할 필드에 대해 다음을 지정합니다.
{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "token" }, "released": { "type": "date" } } } }
다음 쿼리는 $search
단계를 사용하여 1999년 7월 01일 경에 개봉된 영화를 검색합니다. 쿼리에는 다음 하위 파이프라인 단계를 사용하여 입력 문서를 처리하는 $facet
단계가 포함됩니다.
$project
단계에서docs
출력 필드의title
및released
필드를 제외한 문서의 모든 필드를 제외합니다.$limit
단계를 사용하여 다음을 수행합니다.$search
단계 출력을2
개 문서로 제한합니다.meta
출력 필드에 있는1
개 문서로 출력을 제한합니다.
참고
결과를 16MB 문서에 맞추려면 제한이 작아야 합니다.
$replaceWith
스테이지를 사용하여$$SEARCH_META
변수에 저장된 메타데이터 결과를meta
출력 필드에 포함시킵니다.
쿼리에는 meta
필드를 추가하는 $set
단계도 포함되어 있습니다.
참고
다음 쿼리 에 대한 메타데이터 결과 를 보려면 MongoDB Search 에서 쿼리 와 일치 하는 문서 를 반환 해야 합니다 .
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "facet": { 5 "operator": { 6 "near": { 7 "path": "released", 8 "origin": ISODate("1999-07-01T00:00:00.000+00:00"), 9 "pivot": 7776000000 10 } 11 }, 12 "facets": { 13 "genresFacet": { 14 "type": "string", 15 "path": "genres" 16 } 17 } 18 } 19 } 20 }, 21 { "$limit": 2 }, 22 { 23 "$facet": { 24 "docs": [ 25 { "$project": 26 { 27 "title": 1, 28 "released": 1 29 } 30 } 31 ], 32 "meta": [ 33 {"$replaceWith": "$$SEARCH_META"}, 34 {"$limit": 1} 35 ] 36 } 37 }, 38 { 39 "$set": { 40 "meta": { 41 "$arrayElemAt": ["$meta", 0] 42 } 43 } 44 } 45 ])
1 [ 2 { 3 docs: [ 4 { 5 _id: ObjectId('573a1393f29313caabcde1ae'), 6 title: 'Begone Dull Care', 7 released: ISODate('1999-07-01T00:00:00.000Z') 8 }, 9 { 10 _id: ObjectId('573a13a9f29313caabd2048a'), 11 title: 'Fara', 12 released: ISODate('1999-07-01T00:00:00.000Z') 13 } 14 ], 15 meta: { 16 count: { lowerBound: Long('20878') }, 17 facet: { 18 genresFacet: { 19 buckets: [ 20 { _id: 'Drama', count: Long('12149') }, 21 { _id: 'Comedy', count: Long('6436') }, 22 { _id: 'Romance', count: Long('3274') }, 23 { _id: 'Crime', count: Long('2429') }, 24 { _id: 'Thriller', count: Long('2400') }, 25 { _id: 'Action', count: Long('2349') }, 26 { _id: 'Adventure', count: Long('1876') }, 27 { _id: 'Documentary', count: Long('1755') }, 28 { _id: 'Horror', count: Long('1432') }, 29 { _id: 'Biography', count: Long('1244') } 30 ] 31 } 32 } 33 } 34 } 35 ]
이러한 결과에 대해 자세히 알아보려면 패싯 결과를 참조하세요.
학습 계속하기
자세한 학습은 MongoDB 검색에서 패싯을 사용하는 방법을 참조하세요.
교육 과정과 동영상을 통해 MongoDB Search의(facet
Atlas Search 연산자)에 대해 자세히 학습 수 있습니다.
교육 과정으로 배우기
MongoDB Search에서 패싯을 사용하는 방법에 대해 자세히 학습하려면 MongoDB University 의 Intro To MongoDB 과정의 단원 9 을 수강하세요. 1.5 시간 단위로, MongoDB Search에 대한 개요와 MongoDB Search 인덱스 만들기, 복합 연산자를 사용한 $search
쿼리 실행, facet
를 사용한 결과 그룹화에 대한 강의가 포함되어 있습니다.
보면서 배우기
이 동영상을 따라 가며 쿼리 에서 숫자와 문자열 facet
( Atlas Search 연산자) 를 만들고 사용하여 결과를 그룹 하고 그룹 내 결과의 개수를 조회 방법을 학습 .
소요 시간: 11분