faceta
Nesta página
Definição
facet
O coletor
facet
agrupa resultados por valores ou intervalos nos campos facetados especificados e retorna a contagem para cada um desses grupos.Você pode usar
facet
com os$search
$searchMeta
estágios e. O MongoDB recomenda usarfacet
com o estágio para recuperar resultados de metadados somente para a$searchMeta
query. Para recuperar resultados de metadados e queries usando o estágio, use$search
a$$SEARCH_META
variável de agregação.SEARCH_META
Consulte Variável de agregação para saber mais.
Limitação
Você não pode executar queries facet
com explicar.
Sintaxe
facet
tem a seguinte sintaxe:
{ "$searchMeta"|"$search": { "index": <index name>, // optional, defaults to "default" "facet": { "operator": { <operator-specifications> }, "facets": { <facet-definitions> } } } }
Campos
Campo | Tipo | Obrigatório? | Descrição |
---|---|---|---|
| documento | sim | Informações para o agrupamento dos dados para cada faceta. Você deve especificar pelo menos uma Definição de faceta. |
| documento | no | Operador para usar para executar a faceta. Se omitido, o Atlas Search executa a faceta sobre todos os documentos na coleção. |
Definição de Facet
O documento de definição do facet contém o nome do facet e as opções específicas para um tipo de facet. A Atlas Search suporta os seguintes tipos de facetas:
Facets de String
As facets de strings permitem restringir os resultados da Atlas Search com base nos valores de strings mais frequentes no campo de string especificado. Observe que o campo de string deve ser indexado como stringFacet. Para faceta campos de string em documentos incorporados, você também deve indexar os campos pai como o tipo de documento . Quando você faceta strings em arrays ou documentos incorporados, o Atlas Search retorna contagens de faceta com base no número de documentos raiz correspondentes.
Sintaxe
Os facets de string têm a seguinte sintaxe:
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "string", "path" : "<field-path>", "numBuckets" : <number-of-categories>, } } } } }
Opções
Opção | Tipo | Descrição | Obrigatório? |
---|---|---|---|
| int | Número máximo de categorias facetas para retornar nos resultados. O valor deve ser menor ou igual a | no |
| string | Caminho ativado para facet. Você pode especificar um campo que é indexado como um stringFacet. | sim |
| string | Tipo de facet. O valor deve ser | sim |
Exemplo
Exemplo
O exemplo a seguir usa um índice chamado default
na coleção sample_mflix.movies
. O campo genres
na coleção é indexado como o tipo stringFacet e o campo year
é indexado como o tipo número.
{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "stringFacet" }, "year": { "type": "number" } } } }
A query utiliza o estágio $searchMeta
para pesquisar o campo year
na coleção movies
para filmes de 2000 a 2015 e recuperar uma contagem do número de filmes em cada gênero.
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 ]
Para saber mais sobre esses resultados, consulte Resultados de faceta.
Facets Numéricos
Importante
numberFacet agora está obsoleto. Em vez disso,use um número.
As facets numéricas permitem determinar a frequência dos valores numéricos nos resultados da pesquisa, dividindo os resultados em intervalos separados de números. Quando você faceta números em arrays ou documentos incorporados, o Atlas Search retorna contagens de faceta com base no número de documentos raiz correspondentes.
Sintaxe
Os facets numéricos têm a seguinte sintaxe:
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "number", "path" : "<field-path>", "boundaries" : <array-of-numbers>, "default": "<bucket-name>" } } } } }
Opções
Opção | Tipo | Descrição | Obrigatório? |
---|---|---|---|
| array de números | Lista de valores numéricos, em ordem crescente, que especificam os limites para cada bloco. Você deve especificar pelo menos dois limites, que sejam menores ou iguais a mil (
| sim |
| string | Nome de um bucket adicional que conta os documentos retornados do operador que não se enquadram nos limites especificados. Se omitido, o Atlas Search também inclui os resultados do operador de faceta que não se enquadram em um bucket especificado, mas não o inclui em nenhuma contagem de bucket. | no |
| string | sim | |
| string | Tipo de facet. O valor deve ser | sim |
Exemplo
Exemplo
O exemplo a seguir usa um índice chamado default
na sample_mflix.movies
coleção. O year
campo na coleção é indexado como o tipo de número.
{ "mappings": { "dynamic": false, "fields": { "year": [ { "type": "number" } ] } } }
A query usa o estágio $searchMeta
para procurar o campo year
na collection movies
para filmes entre os anos 1980
2000
e recuperar resultados de metadados para a query. A query especifica três buckets:
1980
, limite inferior inclusivo para este bucket1990
, limite superior exclusivo para o bucket1980
e limite inferior inclusivo para este bucket2000
, limite superior exclusivo para o bucket1990
A query também especifica um bucket de default
chamado other
para recuperar resultados da query que não se enquadram em nenhum dos limites especificados.
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 ]
Para saber mais sobre esses resultados, consulte Resultados de faceta.
Facetas de data
As facets de datas permitem restringir resultados de pesquisa com base em uma data. Quando você faceta datas em arrays ou documentos incorporados, o Atlas Search retorna contagens de faceta com base no número de documentos raiz correspondentes.
Sintaxe
Os facets de data têm a seguinte sintaxe:
{ "$searchMeta": { "facet":{ "operator": { <operator-specification> }, "facets": { "<facet-name>" : { "type" : "date", "path" : "<field-path>", "boundaries" : <array-of-dates>, "default": "<bucket-name>" } } } } }
Opções
Opção | Tipo | Descrição | Obrigatório? |
---|---|---|---|
| array de números | Lista de valores de data que especificam os limites para cada bucket. Você deve especificar:
Cada par adjacente de valores atua como o limite inferior inclusivo e o limite superior exclusivo para o bucket. | sim |
| string | Nome de um compartimento adicional que conta os documentos retornados do operador que não se enquadram nos limites especificados. Se omitido, o Atlas Search incluirá os resultados do operador de faceta que também não se enquadram em um bucket especificado, mas o Atlas Search não incluirá esses resultados em nenhuma contagem de bucket. | no |
| string | sim | |
| string | Tipo de facet. O valor deve ser | sim |
Exemplo
Exemplo
O exemplo a seguir usa um índice chamado default
na sample_mflix.movies
coleção. O released
campo na coleção é indexado como o tipo de data.
{ "mappings": { "dynamic": false, "fields": { "released": [ { "type": "date" } ] } } }
A query usa o estágio $searchMeta
para pesquisar filmes entre os anos 2000
a 2015
no campo released
na collection movies
e recuperar resultados de metadados para a string de query. A query especifica quatro buckets:
2000-01-01
, limite inferior inclusivo para este bucket2005-01-01
, limite superior exclusivo para o bucket2000-01-01
e limite inferior inclusivo para este bucket2010-01-01
, limite superior exclusivo para o bucket2005-01-01
e limite inferior inclusivo para este bucket2015-01-01
, limite superior exclusivo para o bucket2010-01-01
A query também especifica um bucket de default
chamado other
para recuperar resultados da query que não se enquadram em nenhum dos limites especificados.
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 ]
Para saber mais sobre esses resultados, consulte Resultados de faceta.
Resultados de facet
Para uma query de facet, o Atlas Search retorna um mapeamento dos nomes de faceta definidos para uma array de compartimentos para essa faceta nos resultados. O documento de resultado do facet contém a opção buckets
, que é uma array de buckets resultantes para o facet. Cada documento de bucket de atributos na array possui os seguintes campos:
Opção | Tipo | Descrição |
---|---|---|
| objeto | Identificador único que identifica este bucket de facet. Este valor corresponde ao tipo de dados que está sendo facetado. |
| int | Contagem de documentos neste facet bucket. Para saber mais sobre o campo |
SEARCH_META
Variável de agregação
Quando você executa sua query utilizando o estágio $search
, o Atlas Search armazena os resultados de metadados na variável $$SEARCH_META
e retorna somente os resultados da pesquisa. É possível usar a variável $$SEARCH_META
em todas as fases do pipeline de agregação compatíveis para visualizar os resultados de metadados da sua query $search
.
O MongoDB recomenda utilizar a variável $$SEARCH_META
somente se você precisar dos resultados da pesquisa e dos resultados de metadados. Caso contrário, use o:
$search
estágio apenas para os resultados da pesquisa.$searchMeta
estágio apenas para os resultados dos metadados.
Limitações
Aplicam-se as seguintes limitações:
Você pode executar queries de facets somente em um único campo. Não é possível executar queries de atributos em grupos de campos.
Você pode executar queries de faceta em collections fragmentadas em clusters que executam apenas o MongoDB v6.0.
Exemplos
Os exemplos a seguir usam a collection sample_mflix.movies
. O exemplo de resultados de metadados demonstra como executar uma query de $searchMeta
com facet
para recuperar somente os metadados nos resultados. O exemplo de metadados e os resultados da pesquisa demonstram como executar uma query de $search
com facet
e a variável de aggregation $SEARCH_META
para recuperar os resultados de pesquisa e dos metadados.
A definição de índice especifica o seguinte para os campos indexarem:
Nome do campo | Tipo de Dados |
---|---|
| |
| |
|
{ "mappings": { "dynamic": false, "fields": { "directors": { "type": "stringFacet" }, "year": { "type": "number" }, "released": { "type": "date" } } } }
As pesquisas de query a seguir para filmes lançados entre 1º de janeiro de 2000 e 31 de janeiro de 2015. Ela solicita metadados no campo directors
e 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 ]
Os resultados mostram uma contagem dos seguintes itens na collection sample_mflix.movies
:
Número de filmes do ano 2000, limite inferior inclusivo, até 2015, limite superior excluindo, que o Atlas Search retornou para a query
Número de filmes para cada diretor que o Atlas Search retornou para a query
A definição de índice especifica o seguinte para os campos indexarem:
Nome do campo | Tipo de Dados |
---|---|
| |
|
{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "stringFacet" }, "released": { "type": "date" } } } }
A query a seguir pesquisa filmes lançados perto de 01 de julho de 1999 usando o estágio $search
. A consulta inclui um estágio $facet
para processar os documentos de entrada usando os seguintes estágios de subpipeline:
Etapa
$project
para excluir todos os campos nos documentos, exceto os campostitle
ereleased
no campo de saídadocs
.$limit
estágio para fazer o seguinte:Limite a saída do estágio
$search
a2
documentosLimite a saída ao documento
1
no campo de saídameta
.
Observação
O limite deve ser pequeno para que os resultados caibam em um documento de 16 MB .
o estágio
$replaceWith
para incluir os resultados de metadados armazenados na variável$$SEARCH_META
no campo de saídameta
A query também inclui um estágio $set
para adicionar o campo meta
.
Observação
Para ver os resultados de metadados da consulta a seguir, o Atlas Search deve retornar documentos que correspondam à consulta.
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 ]
Para saber mais sobre esses resultados, consulte Resultados de faceta.