Definición
facetEl recopilador
facetagrupa los resultados por valores o rangos en los campos facetados especificados y devuelve el recuento de cada uno de esos grupos.Puedes usar
facetcon ambos$searchy$searchMetaetapas. MongoDB recomienda utilizarfacetcon la etapa$searchMetapara 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. VerSEARCH_METAvariable 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.
Sintaxis
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 } }
Campos
Campo | Tipo | ¿Requerido? | Descripción |
|---|---|---|---|
| Documento | Sí | Información para el agrupamiento de los datos para cada faceta. Debe especificar al menos una Definición de Faceta. |
| 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. |
Definición de faceta
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:
String 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.
Sintaxis
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>, } } } } }
opciones
Opción | Tipo | Descripción | ¿Requerido? |
|---|---|---|---|
| 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 | no |
| string | Ruta del campo en la que se aplicará la faceta. Puede especificar un campo indexado como token. | Sí |
| string | Tipo de faceta. El valor debe ser | Sí |
Ejemplo
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.
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 obtener más información sobre estos resultados, consulte Resultados de facetas.
Facetas numéricas
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.
Sintaxis
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>" } } } } }
opciones
Opción | Tipo | Descripción | ¿Requerido? |
|---|---|---|---|
| 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 (
| Sí |
| 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 |
| string | ruta de campo para facetar. Puedes especificar un campo que se indexe como tipo de número. | Sí |
| string | Tipo de faceta. El valor debe ser | Sí |
Ejemplo
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ósito1980y el límite inferior inclusivo para este depósito2000, límite superior exclusivo para el depósito1990
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.
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 obtener más información sobre estos resultados, consulte Resultados de facetas.
Facetas de fecha
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.
Sintaxis
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>" } } } } }
opciones
Opción | Tipo | Descripción | ¿Requerido? |
|---|---|---|---|
| arreglo de números | Lista de valores de fecha que especifican los límites de cada franja. Debe especificar:
Cada par de valores adyacentes actúa como límite inferior inclusivo y límite superior exclusivo para el grupo. | Sí |
| 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 |
| string | Ruta de campo para facetar. Se puede especificar un campo que se indexa como tipo fecha. | Sí |
| string | Tipo de faceta. El valor debe ser | Sí |
Ejemplo
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ósito2000-01-01y el límite inferior inclusivo para este depósito2010-01-01el límite superior exclusivo para el depósito2005-01-01y el límite inferior inclusivo para este depósito2015-01-01, límite superior exclusivo para el depósito2010-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.
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 obtener más información sobre estos resultados, consulte Resultados de facetas.
Comparación de los tipos de campos para 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 | |
Numeric | numberFacet (obsoleto) | Soporte de arreglos: El tipo | |
fecha | dateFacet (desactualizado) | Soporte de arreglos: El tipo |
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.
Resultados de Faceta
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 |
|---|---|---|
| Objeto | Identificador único que identifica este bucket de facetas. Este valor coincide con el tipo de faceta en la que se está aplicando. |
| Int | Recuento de documentos en este bucket de facetas. Para obtener más información sobre el |
SEARCH_META Variable de agregación
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:
$searchetapa solo para los resultados de búsqueda.$searchMetaetapa solo para los resultados de los metadatos.
Limitaciones
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.
Ejemplos
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.
La definición del índice en la colección sample_mflix.movies especifica lo siguiente para los campos a indexar:
{ "mappings": { "dynamic": false, "fields": { "directors": { "type": "token" }, "year": { "type": "number" }, "released": { "type": "date" } } } }
La siguiente consulta busca películas estrenadas entre el 1 de enero de 2000 y el 31 de enero de 2015. Solicita metadatos en los campos directors y 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 ]
Los resultados muestran un recuento de lo siguiente en la colección sample_mflix.movies:
Cantidad de películas del año 2000, límite inferior inclusivo, hasta 2015, límite superior exclusivo, que MongoDB Search devolvió para la query.
Número de películas de cada director que MongoDB Search devolvió para la consulta
Para obtener más información sobre estos resultados, consulte Resultados de facetas.
La definición del índice en la colección sample_mflix.movies especifica lo siguiente para los campos a indexar:
{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "token" }, "released": { "type": "date" } } } }
La siguiente query busca películas lanzadas cerca del 01 de julio de 1999 usando la etapa $search. La query incluye una $facet etapa para procesar los documentos de entrada utilizando las siguientes etapas de sub-pipeline:
$projectetapa para excluir todos los campos de los documentos excepto lostitlereleasedcampos y en eldocscampo de salida$limitetapa para realizar lo siguiente:Limita la salida de la etapa
$searcha2documentosLimite la salida a
1documento en el campo de salidameta
Nota
El límite debe ser pequeño para que los resultados quepan en un documento de 16 MB.
$replaceWithetapa para incluir los resultados de metadatos almacenados en la$$SEARCH_METAvariable en elmetacampo de salida
La consulta también incluye una etapa para agregar $set el meta campo.
Nota
Para ver los resultados de metadatos de la siguiente query, MongoDB Search debe devolver documentos que coincidan con la query.
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' released: ISODate('1999-07-01T00:00:00.000Z') 12 } 13 ], 14 meta: { 15 count: { lowerBound: Long('20878') }, 16 facet: { 17 genresFacet: { 18 buckets: [ 19 { _id: 'Drama', count: Long('12149') }, 20 { _id: 'Comedy', count: Long('6436') }, 21 { _id: 'Romance', count: Long('3274') }, 22 { _id: 'Crime', count: Long('2429') }, 23 { _id: 'Thriller', count: Long('2400') }, 24 { _id: 'Action', count: Long('2349') }, 25 { _id: 'Adventure', count: Long('1876') }, 26 { _id: 'Documentary', count: Long('1755') }, 27 { _id: 'Horror', count: Long('1432') }, 28 { _id: 'Biography', count: Long('1244') } 29 ] 30 } 31 } 32 } 33 } 34 ]
Para obtener más información sobre estos resultados, consulte Resultados de facetas.
La definición del índice en la colección sample_training.companies indexa el campo funding_rounds como embeddedDocuments (documentos integrados). Indexa de forma dinámica todos los campos en el arreglo funding_rounds de objetos y almacena los campos raised_currency_code y raised_amount en el arreglo funding_rounds de objetos utilizando la opción storedSource.
{ "mappings": { "dynamic": false, "fields": { "funding_rounds": { "type": "embeddedDocuments", "dynamic": true, "storedSource": { "include": [ "raised_currency_code", "raised_amount" ] } } } } }
La siguiente query:
Utiliza el
text(MongoDB Search operador) para buscar fondos recaudados enUSD.Utiliza las opciones de returnScope para establecer el contexto de la consulta en el
embeddedDocumentscampofunding_roundsllamado. ParareturnScopeusar, la consulta:Especifica la opción returnStoredSource, que es requerida, para devolver los campos de origen almacenados.
Facetas del campo
raised_amounten la matriz de objetosfunding_rounds. La consulta especifica tres grupos:5000000, límite inferior inclusivo para este intervalo
5250000, límite superior exclusivo para el cubo 5000000 y límite inferior inclusivo para este cubo
5500000, límite superior exclusivo para el intervalo 5250000
1 db.companies.aggregate([ 2 { 3 "$searchMeta": { 4 "returnStoredSource": true, 5 "returnScope": { 6 "path": "funding_rounds" 7 }, 8 "facet": { 9 "operator": { 10 "text": { 11 "path": "funding_rounds.raised_currency_code", 12 "query": "USD" 13 } 14 }, 15 "facets": { 16 "raisedAmountFacet": { 17 "type": "number", 18 "path": "funding_rounds.raised_amount", 19 "boundaries": [5000000, 5250000, 5500000] 20 } 21 } 22 } 23 } 24 } 25 ])
1 [ 2 { 3 count: { lowerBound: Long('5329') }, 4 facet: { 5 raisedAmountFacet: { 6 buckets: [ 7 { _id: 5000000, count: Long('251') }, 8 { _id: 5250000, count: Long('32') } 9 ] 10 } 11 } 12 } 13 ]
En los resultados anteriores de MongoDB Search, los recuentos de facetas se basan en los documentos secundarios incrustados y no en los principales.
Continuar Aprendiendo
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.
Aprende con cursos
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.
Aprende observando
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