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 Etapas$searchy$searchMeta. MongoDB recomienda usarfacetcon 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. ConsulteSEARCH_METAVariable 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.
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 | ¿Obligatorio? | Descripción |
|---|---|---|---|
| Documento | sí | Información para agrupar los datos de cada faceta. Debe especificar al menos una definición de faceta. |
| 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. |
Definición de faceta
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:
Facetas de cuerda
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.
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 | ¿Obligatorio? |
|---|---|---|---|
| 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 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.
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 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.
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 | ¿Obligatorio? |
|---|---|---|---|
| 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 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 |
| string | 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 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 segmento1990, límite superior exclusivo para el depósito1980y límite inferior inclusivo para este depósito2000, límite superior exclusivo para el depósito1990
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.
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 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.
Sintaxis
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>" } } } } }
opciones
Opción | Tipo | Descripción | ¿Obligatorio? |
|---|---|---|---|
| arreglo de números | Lista de valores de fecha que especifican los límites de cada segmento. 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 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 |
| string | 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 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 segmento2005-01-01, límite superior exclusivo para el depósito2000-01-01y límite inferior inclusivo para este depósito2010-01-01, límite superior exclusivo para el depósito2005-01-01y límite inferior inclusivo para este depósito2015-01-01, límite superior exclusivo para el depósito2010-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.
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 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) | Compatibilidad con normalizadores: El | |
Numeric | numberFacet (obsoleto) | Compatibilidad con matrices: El | |
fecha | dateFacet (obsoleto) | Compatibilidad con matrices: El |
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 facetas
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 grupo de facetas. Este valor coincide con el tipo de datos que se están facetando. |
| Int | Recuento de documentos en este bucket de facetas. Para obtener más información sobre el |
SEARCH_META Variable de agregación
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:
$searchescenario solo para los resultados de búsqueda.$searchMetaEtapa solo para los resultados de metadatos.
Limitaciones
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.
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 enero de 01, 2000 y enero de 31, 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:
Número de películas desde el año 2000, inclusive el límite inferior, hasta 2015, exclusivo el límite superior, que MongoDB Search devolvió para la consulta
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 consulta busca películas estrenadas cerca de 01 julio, 1999 utilizando la etapa. La $search $facet consulta incluye una etapa para procesar los documentos de entrada mediante las siguientes etapas de subcanalización:
$projectetapa para excluir todos los campos de los documentos excepto lostitlereleasedcampos y en eldocscampo de salida$limitEtapa para hacer lo siguiente:Limitar 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 consulta, MongoDB Search debe devolver documentos que coincidan con la 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' 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 de índice en la sample_training.companies colección indexa el funding_rounds campo como tipo embeddedDocuments. Indexa dinámicamente todos los campos de la funding_rounds matriz de objetos y almacena los campos raised_currency_code y raised_amount en la funding_rounds matriz de objetos mediante la opción storedSource.
{ "mappings": { "dynamic": false, "fields": { "funding_rounds": { "type": "embeddedDocuments", "dynamic": true, "storedSource": { "include": [ "raised_currency_code", "raised_amount" ] } } } } }
La siguiente consulta:
Utiliza el
text(operador de búsqueda MongoDB) para buscar fondos recaudadosUSDen.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 depósito
5250000, límite superior exclusivo para el cubo 5000000 y límite inferior inclusivo para este cubo
5500000, límite superior exclusivo para el depósito 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 de búsqueda de MongoDB anteriores, los recuentos de facetas se basan en los documentos secundarios integrados y no en los principales.
Continuar Aprendiendo
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.
Aprende con cursos
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.
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