Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

facet (MongoDB Search Operador)

facet

El recopilador facet agrupa los resultados por valores o rangos en los campos facetados especificados y devuelve el recuento de cada uno de esos grupos.

Puedes usar facet con ambos $search y $searchMeta etapas. MongoDB recomienda utilizar facet con la etapa $searchMeta para recuperar únicamente los resultados de metadatos de la query. Para recuperar resultados de metadatos y resultados de query utilizando la etapa $search, debes usar la variable de agregación $$SEARCH_META. Ver SEARCH_META variable de agregación para obtener más información.

Si defines storedSource en tu definición del tipo de campo embeddedDocuments, puedes usar returnScope junto con returnStoredSource para filtrar en campos anidados dentro de un arreglo de objetos. De lo contrario, solo puede crear facetas en el campo de tipo raíz embeddedDocuments. Para un ejemplo de faceteado activado:

  • Campos anidados dentro de un arreglo de objetos, consulta Ejemplo de returnScope.

  • Campo raíz de tipo embeddedDocuments, ver Consulta de Facetas.

facet tiene la siguiente sintaxis:

{
"$searchMeta"|"$search": {
"index": <index name>, // optional, defaults to "default"
"facet": {
"operator": {
<operator-specifications>
},
"facets": {
<facet-definitions>
}
},
"returnScope": {
"path": "<embedded-documents-field-to-query>"
},
"returnStoredSource": true
}
}
Campo
Tipo
¿Requerido?
Descripción

facets

Documento

Información para el agrupamiento de los datos para cada faceta. Debe especificar al menos una Definición de Faceta.

operator

Documento

no

El operador que se debe usar para realizar la faceta. Si se omite, MongoDB Search realiza el facetado sobre todos los documentos de la colección.

El documento de definición de la faceta contiene el nombre de la faceta y las opciones específicas de un tipo de faceta. MongoDB Search admite los siguientes tipos de facetas:

Importante

stringFacet ya no está actualizado. Use token en su lugar, lo que mejora el facetado.

Para obtener más información sobre las diferencias entre los tipos de campo actualizados y obsoletos para faceta, consulte Comparar Tipos de Campo para Faceta.

Las facetas de cadena permiten restringir los resultados de MongoDB Search según los valores de cadena más frecuentes en el campo de cadena especificado. Tenga en cuenta que el campo de cadena debe indexarse ​​como token. Para aplicar facetas a campos de cadena en documentos incrustados, también debe indexar los campos principales como tipo de documento. Al aplicar facetas a cadenas en matrices o documentos incrustados, MongoDB Search devuelve un recuento de facetas basado en el número de documentos raíz coincidentes.

Las facetas de String tienen la siguiente sintaxis:

{
"$searchMeta": {
"facet":{
"operator": {
<operator-specification>
},
"facets": {
"<facet-name>" : {
"type" : "string",
"path" : "<field-path>",
"numBuckets" : <number-of-categories>,
}
}
}
}
}
Opción
Tipo
Descripción
¿Requerido?

numBuckets

Int

Número máximo de categorías de facetas que se mostrarán en los resultados. El valor debe ser menor o igual a 1000. Si se especifica, MongoDB Search podría mostrar menos categorías de las solicitadas si los datos se agrupan en menos categorías que el número solicitado. Si se omite, el valor predeterminado es 10, lo que significa que MongoDB Search solo mostrará las 10 categorías de facetas principales por recuento.

no

path

string

Ruta del campo en la que se aplicará la faceta. Puede especificar un campo indexado como token.

type

string

Tipo de faceta. El valor debe ser string.

Ejemplo

El siguiente ejemplo utiliza un índice llamado default en la sample_mflix.movies colección. El genres campo de la colección está indexado como token y el year campo como número.

{
"mappings": {
"dynamic": false,
"fields": {
"genres": {
"type": "token"
},
"year": {
"type": "number"
}
}
}
}

La etapa utiliza la $searchMeta para buscar year en el campo en la movies colección películas desde 2000 hasta 2015 y recuperar un recuento del número de películas en cada género.

1db.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 obtener más información sobre estos resultados, consulte Resultados de facetas.

Importante

numberFacet ahora está desactualizado. Usa number en su lugar, que proporciona una mejor facetación.

Para obtener más información sobre las diferencias entre los tipos de campo actualizados y obsoletos para faceta, consulte Comparar Tipos de Campo para Faceta.

Las facetas numéricas permiten determinar la frecuencia de los valores numéricos en los resultados de búsqueda desglosándolos en rangos de números. Al aplicar facetas a números en matrices o documentos incrustados, MongoDB Search devuelve un recuento de facetas basado en el número de documentos raíz coincidentes.

Los facetas numéricas tienen la siguiente sintaxis:

{
"$searchMeta": {
"facet":{
"operator": {
<operator-specification>
},
"facets": {
"<facet-name>" : {
"type" : "number",
"path" : "<field-path>",
"boundaries" : <array-of-numbers>,
"default": "<bucket-name>"
}
}
}
}
}
Opción
Tipo
Descripción
¿Requerido?

boundaries

arreglo de números

Lista de valores numéricos, en orden ascendente, que especifican los límites de cada agrupación. Debes especificar al menos dos límites, que sean menores o iguales a mil ([2, 1000]). Cada par de valores adyacentes actúa como el límite inferior inclusivo y el límite superior exclusivo para el bucket. Puedes especificar cualquier combinación de valores de los siguientes tipos BSON:

  • entero de 32 bits (int32)

  • entero de 64 bits (int64)

  • punto flotante binario de 64 bits (double)

default

string

Nombre de un bucket adicional que cuenta los documentos devueltos por el operador que no se encuentran dentro de los límites especificados. Si se omite, MongoDB Search también incluye los resultados del operador de faceta que no caen en un segmento especificado, pero no los incluye en ningún recuento de segmentos.

no

path

string

ruta de campo para facetar. Puedes especificar un campo que se indexe como tipo de número.

type

string

Tipo de faceta. El valor debe ser number.

Ejemplo

El ejemplo siguiente utiliza un índice llamado default en la colección sample_mflix.movies. El campo year en la colección está indexado como el tipo número.

{
"mappings": {
"dynamic": false,
"fields": {
"year": [
{
"type": "number"
}
]
}
}
}

La query utiliza la etapa $searchMeta para buscar en el campo year de la colección movies para películas entre los años 1980 y 2000 y recuperar los resultados de metadatos de la query. La query especifica tres contenedores:

  • 1980_, límite inferior inclusivo para este cubo__

  • 1990el límite superior exclusivo para el depósito 1980 y el límite inferior inclusivo para este depósito

  • 2000, límite superior exclusivo para el depósito 1990

La query también especifica un default bucket llamado other para recuperar los resultados de la query que no se encuentren dentro de ninguno de los límites especificados.

1db.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 obtener más información sobre estos resultados, consulte Resultados de facetas.

Importante

dateFacet está ahora obsoleto. Utiliza date en su lugar, lo que proporciona una mejor faceta.

Para obtener más información sobre las diferencias entre los tipos de campo actualizados y obsoletos para faceta, consulte Comparar Tipos de Campo para Faceta.

Las facetas de fecha permiten restringir los resultados de búsqueda según una fecha. Al aplicar facetas a fechas en matrices o documentos incrustados, MongoDB Search devuelve un recuento de facetas basado en el número de documentos raíz coincidentes.

Los facetas de fecha tienen la siguiente sintaxis:

{
"$searchMeta": {
"facet":{
"operator": {
<operator-specification>
},
"facets": {
"<facet-name>" : {
"type" : "date",
"path" : "<field-path>",
"boundaries" : <array-of-dates>,
"default": "<bucket-name>"
}
}
}
}
}
Opción
Tipo
Descripción
¿Requerido?

boundaries

arreglo de números

Lista de valores de fecha que especifican los límites de cada franja. Debe especificar:

  • Al menos dos límites, que sean menores o iguales a mil ([2, 1000])

  • Valores en orden ascendente, con la fecha más antigua primero

Cada par de valores adyacentes actúa como límite inferior inclusivo y límite superior exclusivo para el grupo.

default

string

Nombre de un bucket adicional que cuenta los documentos devueltos por el operador que no están dentro de los límites especificados. Si se omite, MongoDB Search también incluye los resultados del operador de faceta que no entran dentro de un bucket especificado, pero MongoDB Search no incluye estos resultados en ningún conteo de bucket.

no

path

string

Ruta de campo para facetar. Se puede especificar un campo que se indexa como tipo fecha.

type

string

Tipo de faceta. El valor debe ser date.

Ejemplo

El ejemplo siguiente utiliza un índice llamado default en la colección sample_mflix.movies. El campo released en la colección se indexa como el tipo fecha.

{
"mappings": {
"dynamic": false,
"fields": {
"released": [
{
"type": "date"
}
]
}
}
}

El query usa la etapa $searchMeta para búsqueda en el campo released de la colección movies películas entre los años 2000 y 2015 y recuperar resultados de metadatos para la string del query. La consulta especifica cuatro grupos:

  • 2000-01-01_, límite inferior inclusivo para este cubo__

  • 2005-01-01el límite superior exclusivo para el depósito 2000-01-01 y el límite inferior inclusivo para este depósito

  • 2010-01-01el límite superior exclusivo para el depósito 2005-01-01 y el límite inferior inclusivo para este depósito

  • 2015-01-01, límite superior exclusivo para el depósito 2010-01-01

La query también especifica un default bucket llamado other para recuperar los resultados de la query que no se encuentren dentro de ninguno de los límites especificados.

1db.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 obtener más información sobre estos resultados, consulte Resultados de facetas.

Los tipos de campo de MongoDB Search actualizados proporcionan una funcionalidad mejorada para soporte facetas en comparación con los tipos obsoletos (stringFacet, numberFacet, dateFacet). La siguiente tabla destaca las diferencias clave en la funcionalidad:

Categoría de faceta
Tipo de campo actualizado
Tipo de faceta obsoleto
Diferencias clave

String

stringFacet (obsoleto)

Soporte de normalizador: El tipo token admite normalizadores que transforman los contenedores de facetas. Por ejemplo, con normalizer: lowercase, "ADIDAS" y "adidas" se contabilizan en el mismo grupo, mientras que stringFacet los trata como grupos independientes.

Numeric

numberFacet (obsoleto)

Soporte de arreglos: El tipo number considera los valores dentro de arreglos para los segmentos de facetas. Por ejemplo, un documento con un valor de arreglo [0, 10] cuenta tanto para los cubetas [1, 5] y [6, 10] mientras que numberFacet ignora completamente los valores de arreglo.

fecha

dateFacet (desactualizado)

Soporte de arreglos: El tipo date considera los valores dentro de arreglos para los segmentos de facetas. Por ejemplo, un valor de arreglo con fechas puede contribuir a múltiples rangos de fechas, mientras que dateFacet ignora completamente los valores de arreglo.

Nota

Cuando se definen los tipos de campo obsoletos y actualizados para el mismo campo, los tipos de faceta obsoletos tienen prioridad. Por ejemplo, si se definen token y stringFacet para un campo, el cálculo de la faceta utiliza la asignación stringFacet.

Para una consulta de faceta, MongoDB Search devuelve una asignación de los nombres de faceta definidos a una matriz de cubos para esa faceta en los resultados. El documento de resultados de la faceta contiene la opción buckets, que es una matriz de cubos resultantes para la faceta. Cada documento de cubo de faceta de la matriz tiene los siguientes campos:

Opción
Tipo
Descripción

_id

Objeto

Identificador único que identifica este bucket de facetas. Este valor coincide con el tipo de faceta en la que se está aplicando.

count

Int

Recuento de documentos en este bucket de facetas. Para obtener más información sobre el count campo, consulte "Recuento de resultados de búsqueda de MongoDB".

Cuando ejecutas tu consulta utilizando la etapa $search, MongoDB Search almacena los resultados de metadatos en la variable $$SEARCH_META y devuelve solo los resultados de búsqueda. Puedes usar la variable $$SEARCH_META en todas las etapas del pipeline de agregación admitidas para consultar los resultados de metadatos de su $search query.

MongoDB recomienda usar la variable $$SEARCH_META solo si necesitas tanto los resultados de la búsqueda como los resultados de los metadatos. De lo contrario, utiliza la:

  • $search etapa solo para los resultados de búsqueda.

  • $searchMeta etapa solo para los resultados de los metadatos.

Se aplican las siguientes limitaciones:

  • Solo puedes ejecutar query de faceta en un único campo. No puedes ejecutar consultas de facetas sobre grupos de campos.

Los siguientes ejemplos usan los datos de muestra. El ejemplo de resultados de metadatos demuestra cómo ejecutar una $searchMeta query con facet para recuperar solo los metadatos en los resultados. El ejemplo de metadatos y resultados de búsqueda demuestra cómo ejecutar una $search query con facet y la variable de agregación $SEARCH_META para recuperar los resultados tanto de la búsqueda como de los metadatos. El ejemplo returnScope demuestra cómo aplicar facetas en campos anidados en un arreglo de objetos indexados dinámicamente usando el tipo embeddedDocuments.

Para obtener más información, se puede consultar Cómo utilizar facetas con la MongoDB Search.

Puede obtener más información sobre facet (Operador de búsqueda de MongoDB) en MongoDB Search con nuestro curso y video.

Para aprender más sobre el uso de facetas en MongoDB Search, toma la Unidad 9 del Curso Introductorio a MongoDB en MongoDB University. La unidad de 1.5 horas incluye una visión general de MongoDB Search y lecciones sobre la creación de índices de MongoDB Search, ejecución de consultas de $search con operadores compuestos y agrupación de resultados mediante facet.

Siga este video para aprender cómo crear y usar un operador numérico y de cadena facet (operador de búsqueda de MongoDB) en su consulta para agrupar resultados y recuperar un recuento de los resultados en los grupos.

Duración: 11 minutos

Volver

exists

En esta página