Definición
facetEl
facetcolector agrupa los resultados por valores o rangos en los campos facetados especĆficos y devuelve el conteo para cada uno de esos grupos.Puedes usar
facettanto en la etapa$searchcomo en la etapa$searchMeta. MongoDB recomienda utilizarfacetcon la$searchMetaetapa para recuperar sólo 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. VeaSEARCH_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 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 | ¿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 ahora estĆ” desfasado. Usa token en su lugar, lo que proporciona mejores facetas.
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 string permiten acotar los resultados de MongoDB Search en función de los valores de string mĆ”s frecuentes del campo de string especificado. Ten en cuenta que el campo de string debe estar indexado como token. Para facetar los campos de string en los documentos incrustados, tambiĆ©n debes indexar los campos principales como el tipo de documento. Cuando se aplican facetas a strings en arreglos o documentos incrustados, MongoDB Search devuelve recuentos de facetas basados 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 a devolver en los resultados. El valor debe ser menor o igual a | no |
| string | Ruta de campo para expresar facetas. Puede especificar un campo que tenga un Ćndice como un token. | SĆ |
| string | Tipo de faceta. El valor debe ser | SĆ |
Ejemplo
Ejemplo
El siguiente ejemplo utiliza un Ćndice llamado default en la colección sample_mflix.movies. El campo genres en la colección estĆ” indexado como el tipo token y el campo year estĆ” indexado como el tipo 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
stringFacet ahora estĆ” desfasado. Usa token en su lugar, lo que proporciona mejores facetas.
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 dividiendo los resultados en rangos separados de nĆŗmeros. Cuando aplicas facetas a nĆŗmeros en arreglos o documentos incrustados, MongoDB Search devuelve recuentos de facetas en función de la cantidad 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ósito2000lĆmite superior exclusivo para el grupo1990
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
stringFacet ahora estĆ” desfasado. Usa token en su lugar, lo que proporciona mejores facetas.
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 te permiten limitar los resultados de bĆŗsqueda segĆŗn una fecha. Cuando aplicas facetas por fechas en arreglos o documentos incrustados, MongoDB Search devuelve los recuentos de facetas segĆŗn 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 adyacente de valores actĆŗa como el lĆmite inferior inclusivo y el lĆmite superior exclusivo para el contenedor. | 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-01lĆmite superior exclusivo para el grupo2010-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 anticuado | Diferencias clave |
|---|---|---|---|
String | stringFacet (desactualizado) | Soporte de normalizador: El tipo | |
Numeric | numberFacet (desactualizado) | Soporte de arreglos: El tipo | |
fecha | dateFacet (desactualizado) | Soporte de arreglos: El tipo |
Nota
Cuando tanto los tipos de campo obsoletos como los actualizados se definen para el mismo campo, los tipos de faceta obsoletos tienen prioridad. Por ejemplo, si token y stringFacet estÔn definidos para un campo, el cÔlculo de facetas utiliza la asignación stringFacet.
Resultados de Faceta
Para una consulta de faceta, MongoDB Search devuelve una asignación de los nombres de facetas definidos a un arreglo de buckets para esa faceta en los resultados. El documento de resultados de la faceta contiene la opción buckets, que es un arreglo de cubos resultantes para la faceta. Cada documento de agrupación por facetas en el arreglo 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 | Cantidad de documentos en este bucket de facetas. Para obtener mÔs información sobre el campo |
Facetas de selección múltiple
MongoDB Search te permite ver y seleccionar múltiples "buckets" dentro de la misma faceta simultÔneamente. Normalmente, seleccionar un bucket dentro de una faceta filtra los resultados de la búsqueda según esa selección y modifica los recuentos para todas las facetas.
Ejemplo
Suponga que una definición de Ćndice para la colección sample_airbnb.listings especifica facetas para los siguientes campos:
cancellation_policyroom_typeaccommodates
La faceta cancellation_policy tiene los siguientes cubos:
flexiblemoderatestrict_14_with_grace_periodsuper_strict_30super_strict_60
Cada uno tiene su propio recuento de resultados. Cuando busques el moderate cancellation_policy, el conteo de los otros cuatro grupos serÔ de 0. AdemÔs, los recuentos para los cubos en los aspectos room_type y accommodates se reducen al número de resultados en cada cubo que también tienen un flexible cancellation_policy.
En escenarios en los que necesita un control mÔs granular sobre cómo los facetas afectan el conteo de resultados de búsqueda, active el faceting de selección múltiple con la propiedad doesNotAffect en sus consultas facetadas. Estas facetas siguen filtrando los resultados, pero la query no altera sus recuentos de resultados.
Ejemplo
Considere una query contra la colección sample_airbnb.listings para documentos que tengan un moderate cancellation_policy. Si especifica un doesNotAffect valor de cancellation_policy, los recuentos para los buckets en la faceta cancellation_policy no cambian, pero los recuentos de resultados para los buckets de otras facetas se reducen al número de resultados en cada bucket que también tengan un moderate cancellation_policy.
Para obtener mÔs información, consulta el ejemplo de Selección múltiple por facetas.
Por último, en casos de uso con muchas facetas, puede ser útil limitar qué otros filtros afectan a una faceta determinada. Puedes hacerlo especificando cualquier faceta en la propiedad doesNotAffect de cualquier filtro, incluidas facetas en otros campos. Esto permite observar de un vistazo qué selecciones reducen las opciones mÔs o menos rÔpidamente.
Ejemplo
Considere una query contra la colección sample_airbnb.listings para documentos con un valor accommodates de 3. Si especificas un valor de doesNotAffect de cancellation_policy, los recuentos de resultados para los segmentos room_type se reducen al número de resultados en cada segmento que también acomodan 3 personas, pero los recuentos de resultados para los segmentos en cancellation_policy no se ven afectados.
Para obtener mÔs información, consulte el ejemplo de exclusión de filtro entre facetas.
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 query busca pelĆculas que se estrenaron 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 para cada director que MongoDB Search devolvió para la query
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 los campostitleyreleaseden el campo de salidadocs$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 variable$$SEARCH_METAen el campo de salidameta
La consulta tambiƩn incluye una etapa $set para agregar el campo meta.
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 returnScope para establecer el contexto de la consulta en el campo
embeddedDocumentsllamadofunding_rounds. Para utilizarreturnScope, la query:- Especifica la opción returnStoredSource, que es requerida, para devolver los campos de origen almacenados.
Facetas en el campo
raised_amountdel arreglofunding_roundsde objetos. La query especifica tres buckets: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.
La siguiente definición de Ćndice en la colección sample_airbnb.listingsAndReviews indexa automĆ”ticamente todos los campos indexables de manera dinĆ”mica y configura los campos cancellation_policy, room_type y price para bĆŗsquedas facetadas.
{ "mappings": { "dynamic": false, "fields": { "cancellation_policy": { "type": "token" }, "room_type": { "type": "token" }, "accommodates": { "type": "number" } } } }
La query siguiente utiliza la etapa $searchMeta para realizar las siguientes acciones:
Faceta en los campos
cancellation_policy,roomTypeyaccommodates.La faceta
cancellation_policytiene los siguientes cubos:"strict_14_with_grace_period""moderate""flexible""super_strict_30""super_strict_60"
La faceta
room_typetiene los siguientes cubos:"Entire home/apt""Private room""Shared room"
La consulta divide la faceta
accommodatesen bloques para:1_, lĆmite inferior inclusivo para este cubo__2lĆmite superior exclusivo para el grupo1y lĆmite inferior inclusivo para este grupo.4lĆmite superior exclusivo para el grupo2y lĆmite inferior inclusivo para este grupo.8lĆmite superior exclusivo para el grupo4
Realice una bĆŗsqueda de
compoundOperador para listados que deben contener el textonew york cityen eldescriptiony filtrar los resultados para los listados con unmoderatecancellation_policy. La configuración dedoesNotAffectgarantiza que filtrar por unmoderatecancellation_policyno altere los recuentos de otros cubos en la faceta; los recuentos para"strict_14_with_grace_period","flexible","super_strict_30"y"super_strict_60"son valores distintos de cero.
1 db.listingsAndReviews.aggregate([ 2 { 3 $searchMeta: { 4 facet: { 5 facets: { 6 accommodatesFacet: { 7 path: "accommodates", 8 type: "number", 9 boundaries: [1,2,4,8], 10 }, 11 cancellationFacet: { 12 path: "cancellation_policy", 13 type: "string", 14 }, 15 roomTypeFacet: { 16 path: "room_type", 17 type: "string", 18 } 19 }, 20 operator: { 21 compound: { 22 must: [ 23 { 24 text: { 25 path: "description", 26 query: "new york city", 27 }, 28 }, 29 ], 30 filter: [ 31 { 32 equals: { 33 path: "cancellation_policy", 34 value: "moderate", 35 doesNotAffect: 36 "cancellationFacet", 37 }, 38 }, 39 ], 40 }, 41 }, 42 }, 43 } 44 }, 45 ]
1 [ 2 { 3 count: { lowerBound: Long('531') }, 4 facet: { 5 accomodatesFacet: { 6 buckets: [ 7 { _id: "1", count: Long('25') }, 8 { _id: "2", count: Long('270') }, 9 { _id: "4", count: Long('204') }, 10 ] 11 }, 12 cancellationFacet: { 13 buckets: [ 14 { _id: "strict_14_with_grace_period", count: Long('849') }, 15 { _id: "moderate", count: Long('531') }, 16 { _id: "flexible", count: Long('380') }, 17 { _id: "super_strict_60", count: Long('25') } 18 { _id: "super_strict_30", count: Long('380') } 19 ] 20 }, 21 roomTypeFacet: { 22 buckets: [ 23 { _id: "Entire home/apt", count: Long('369') }, 24 { _id: "Private room", count: Long('159') }, 25 { _id: "Shared room", count: Long('3') }, 26 ] 27 } 28 } 29 } 30 ]
Observe que los recuentos para compartimentos en cancellationFacet no se reducen a cero a pesar de que el filtro de query sobre un valor de moderate.
La siguiente definición de Ćndice en la colección sample_airbnb.listingsAndReviews indexa los campos cancellation_policy, room_type y price, lo que permite la bĆŗsqueda facetada en ellos.
{ "mappings": { "dynamic": true, "fields": { "cancellation_policy": { "type": "token" }, "room_type": { "type": "token" }, "accommodates": { "type": "number" } } } }
La siguiente query:
Busca anuncios que incluyan el texto
new york cityen sudescriptiony que tengan uncancellation_policydemoderate.Facetas en los campos
cancellation_policy,roomTypeyaccommodates.Cada una de las facetas
cancellation_policyyroomTypetiene tres buckets, correspondientes a los tres valores Ćŗnicos de estos campos en toda la colección. La consulta divide laaccommodatesfaceta en agrupamientos para:1_, lĆmite inferior inclusivo para este cubo__2lĆmite superior exclusivo para el grupo1y lĆmite inferior inclusivo para este grupo.4lĆmite superior exclusivo para el grupo2y lĆmite inferior inclusivo para este grupo.8lĆmite superior exclusivo para el grupo4
Establece la propiedad
doesNotAffecten el Operadorequalsdelcompound.filterenaccommodatesFacet. Esto excluye los cubos dentro de la facetaaccommodatesdel filtrado. Como resultado, el filtrado en elmoderatecancellation_policyreduce la cantidad de otros buckets en la facetacancellation_policya0y reduce la cantidad de buckets en la facetaroomType, pero la cantidad de buckets en la facetaaccommodatesno cambia. Esto permite comparar el impacto del filtrado en diferentes facetas.
1 db.listingsAndReviews.aggregate([ 2 { 3 $searchMeta: { 4 facet: { 5 facets: { 6 accommodatesFacet: { 7 path: "accommodates", 8 type: "number", 9 boundaries: [1,2,4,8], 10 }, 11 cancellationFacet: { 12 path: "cancellation_policy", 13 type: "string", 14 }, 15 roomTypeFacet: { 16 path: "room_type", 17 type: "string", 18 } 19 }, 20 operator: { 21 compound: { 22 must: [ 23 { 24 text: { 25 path: "description", 26 query: "new york city", 27 }, 28 }, 29 ], 30 filter: [ 31 { 32 equals: { 33 path: "cancellation_policy", 34 value: "moderate", 35 doesNotAffect: 36 "accommodatesFacet", 37 }, 38 }, 39 ], 40 }, 41 }, 42 }, 43 }, 44 }, 45 ]
1 [ 2 { 3 count: { lowerBound: Long('531') }, 4 facet: { 5 accomodatesFacet: { 6 buckets: [ 7 { _id: "1", count: Long('25') }, 8 { _id: "2", count: Long('270') }, 9 { _id: "4", count: Long('204') }, 10 ] 11 }, 12 cancellationFacet: { 13 buckets: [ 14 { _id: "flexible", count: Long('XXX') }, 15 { _id: "moderate", count: Long('531') }, 16 { _id: "strict_14_with_grace_period", count: Long('XXX') }, 17 ] 18 }, 19 roomTypeFacet: { 20 buckets: [ 21 { _id: "Entire home/apt", count: Long('369') }, 22 { _id: "Private room", count: Long('159') }, 23 { _id: "Shared room", count: Long('3') }, 24 ] 25 } 26 } 27 } 28 ]
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
Sigue este video para aprender cómo puedes crear y utilizar un facet (MongoDB Search Operator) numérico y de string en tu consulta para agrupar resultados y recuperar un recuento de los resultados en los grupos.
Duración: 11 minutos