Docs Menu
Docs Home
/ /

facet (Operador de búsqueda de MongoDB)

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 Etapas$searchy$searchMeta. MongoDB recomienda usar facet con la etapa$searchMetapara recuperar los resultados de metadatos únicamente de la consulta. Para recuperar los resultados de metadatos y de la consulta con la etapa$search, debe usar la variable de agregación $$SEARCH_META. Consulte SEARCH_META Variable de agregación para obtener más información.

Si defines "storedSource" en la definición del tipo de campo embeddedDocuments, puedes usar "returnScope" con "returnStoredSource" para aplicar facetas a campos anidados dentro de un array de objetos. De lo contrario, solo puedes aplicar facetas al campo raíz de tipo embeddedDocuments. Para un ejemplo de aplicación de facetas en:

  • Campos anidados dentro de una matriz de objetos, consulte el 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
¿Obligatorio?
Descripción

facets

Documento

Información para agrupar los datos de cada faceta. Debe especificar al menos una definición de faceta.

operator

Documento

no

Operador que se utiliza para aplicar la faceta. Si se omite, MongoDB Search aplica la faceta a todos los documentos de la colección.

El documento de definición de faceta contiene el nombre de la faceta y las opciones específicas de cada tipo. 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 campos actualizados y obsoletos para facetas, consulte Comparación de tipos de campos para facetas.

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
¿Obligatorio?

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 consulta utiliza la etapa para $searchMeta buscar year en el campo de la movies colección películas del 2000 al 2015 y recuperar un recuento de la cantidad de películas de 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 campos actualizados y obsoletos para facetas, consulte Comparación de tipos de campos para facetas.

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
¿Obligatorio?

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 32bits (int32)

  • Entero de 64bits (int64)

  • punto flotante binario de 64bits (double)

default

string

Nombre de un contenedor adicional que contabiliza 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 se encuentran dentro de un contenedor específico, pero no los incluye en ningún recuento de contenedores.

no

path

string

Ruta del campo en la que se aplicará la faceta. Puede especificar un campo indexado como tipo numérico.

type

string

Tipo de faceta. El valor debe ser number.

Ejemplo

El siguiente ejemplo utiliza un índice llamado default en la sample_mflix.movies colección. El year campo de la colección está indexado como tipo numérico.

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

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

  • 1980, límite inferior inclusivo para este segmento

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

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

La consulta también especifica un depósito default llamado other para recuperar los resultados de la consulta 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 ya no está actualizado. Use date en su lugar, lo que mejora el facetado.

Para obtener más información sobre las diferencias entre los tipos de campos actualizados y obsoletos para facetas, consulte Comparación de tipos de campos para facetas.

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.

Las 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
¿Obligatorio?

boundaries

arreglo de números

Lista de valores de fecha que especifican los límites de cada segmento. 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 contenedor adicional que contabiliza 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 se encuentran dentro de un contenedor especificado, pero MongoDB Search no los incluye en ningún recuento de contenedores.

no

path

string

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

type

string

Tipo de faceta. El valor debe ser date.

Ejemplo

El siguiente ejemplo utiliza un índice llamado default en la sample_mflix.movies colección. El released campo de la colección está indexado como tipo de 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 segmento

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

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

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

La consulta también especifica un depósito default llamado other para recuperar los resultados de la consulta 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)

Compatibilidad con normalizadores: El token tipo admite normalizadores que transforman los grupos de facetas. Por ejemplo,normalizer: lowercase con, "ADIDAS" y "adidas" se consideran para el mismo grupo, mientras que stringFacet los trata como grupos separados.

Numeric

numberFacet (obsoleto)

Compatibilidad con matrices: El number tipo considera los valores de las matrices para los grupos de facetas. Por ejemplo, un documento con un valor de matriz [0, 10] se contabiliza para los grupos [1, 5] y, mientras [6, 10] que numberFacet ignora completamente los valores de la matriz.

fecha

dateFacet (obsoleto)

Compatibilidad con matrices: El date tipo considera los valores de las matrices para los grupos de facetas. Por ejemplo, un valor de matriz con fechas puede contribuir a varios grupos de rangos de fechas, mientras que dateFacet ignora completamente los valores de matriz.

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 grupo de facetas. Este valor coincide con el tipo de datos que se están facetando.

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".

Al ejecutar su consulta con la etapa, MongoDB Search almacena los resultados de los metadatos en $search la $$SEARCH_META variable y devuelve únicamente los resultados de la búsqueda. Puede usar la $$SEARCH_META variable en todas las etapas de la canalización de agregación compatibles para ver los resultados de los metadatos de su $search consulta.

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

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

  • $searchMeta Etapa solo para los resultados de metadatos.

Se aplican las siguientes limitaciones:

  • Solo se pueden ejecutar consultas de facetas en un solo campo. No se pueden ejecutar consultas de facetas en 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, consulte Cómo usar facetas con la búsqueda de MongoDB.

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

Para obtener más información sobre 9 el uso de facetas en MongoDB Search, tome la Unidad del Curso de Introducción a MongoDB en MongoDB University. Esta 1.5 unidad de horas incluye una descripción general de MongoDB Search y lecciones sobre la creación de índices de MongoDB Search,$search la ejecución de consultas con operadores compuestos y la agrupación de resultados facet con.

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