Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

facet (MongoDB Search Operador)

facet

El facet colector 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 facet tanto en la etapa $search como en la etapa $searchMeta. MongoDB recomienda utilizar facet con la $searchMeta etapa 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. Vea 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:

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

SĆ­

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

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 a devolver en los resultados. El valor debe ser menor o igual a 1000. Si se especifica, MongoDB Search puede devolver menos categorías de las solicitadas si los datos estÔn agrupados en menos categorías que el número solicitado. Si se omite, el valor por defecto es 10, lo que significa que MongoDB Search solo devolverÔ las principales 10 categorías de facetas por cantidad.

no

path

string

Ruta de campo para expresar facetas. Puede especificar un campo que tenga un Ć­ndice como un token.

SĆ­

type

string

Tipo de faceta. El valor debe ser string.

SĆ­

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.

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

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.

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)

SĆ­

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.

SĆ­

type

string

Tipo de faceta. El valor debe ser number.

SĆ­

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

  • 2000lĆ­mite superior exclusivo para el grupo 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

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.

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 son menores o iguales a mil ([2, 1000])

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

Cada par adyacente de valores actĆŗa como el lĆ­mite inferior inclusivo y el lĆ­mite superior exclusivo para el contenedor.

SĆ­

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.

SĆ­

type

string

Tipo de faceta. El valor debe ser date.

SĆ­

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-01lĆ­mite superior exclusivo para el grupo 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 anticuado
Diferencias clave

String

stringFacet (desactualizado)

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 (desactualizado)

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

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

_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

Cantidad de documentos en este bucket de facetas. Para obtener mÔs información sobre el campo count, consulta Recuento de resultados de MongoDB Search.

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_policy

  • room_type

  • accommodates

La faceta cancellation_policy tiene los siguientes cubos:

  • flexible

  • moderate

  • strict_14_with_grace_period

  • super_strict_30

  • super_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.

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.

Completar los pasos anteriores en el tutorial e instalar las dependencias

La definición del índice en la colección sample_mflix.movies especifica lo siguiente para los campos a indexar:

Nombre de campo
Tipo de dato

directors

year

released

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

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

Busca usando $search y recupera tanto los resultados de bĆŗsqueda como los de metadatos usando la variable $$SEARCH_META.

La definición del índice en la colección sample_mflix.movies especifica lo siguiente para los campos a indexar:

Nombre de campo
Tipo de dato

genres

released

{
"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:

  • $project etapa para excluir todos los campos de los documentos excepto los campos title y released en el campo de salida docs

  • $limit etapa para realizar lo siguiente:

    • Limita la salida de la etapa $search a 2 documentos

    • Limite la salida a 1 documento en el campo de salida meta

    Nota

    El lƭmite debe ser pequeƱo para que los resultados quepan en un documento de 16 MB.

  • $replaceWith etapa para incluir los resultados de metadatos almacenados en la variable $$SEARCH_META en el campo de salida meta

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.

1db.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.

Buscar utilizando faceta y faceta en campos hijo en embeddedDocuments.

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 en USD .

  • Utiliza las opciones returnScope para establecer el contexto de la consulta en el campo embeddedDocuments llamado funding_rounds. Para utilizar returnScope, la query:

    • Especifica la opción returnStoredSource, que es requerida, para devolver los campos de origen almacenados.
  • Facetas en el campo raised_amount del arreglo funding_rounds de 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

1db.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.

Busca con doesNotAffect para obtener un control mƔs granular sobre el filtrado de facetas.

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, roomType y accommodates.

    La faceta cancellation_policy tiene los siguientes cubos:

    • "strict_14_with_grace_period"

    • "moderate"

    • "flexible"

    • "super_strict_30"

    • "super_strict_60"

    La faceta room_type tiene los siguientes cubos:

    • "Entire home/apt"

    • "Private room"

    • "Shared room"

    La consulta divide la faceta accommodates en bloques para:

    • 1_, lĆ­mite inferior inclusivo para este cubo__

    • 2lĆ­mite superior exclusivo para el grupo 1 y lĆ­mite inferior inclusivo para este grupo.

    • 4lĆ­mite superior exclusivo para el grupo 2 y lĆ­mite inferior inclusivo para este grupo.

    • 8lĆ­mite superior exclusivo para el grupo 4

  • Realice una bĆŗsqueda de compound Operador para listados que deben contener el texto new york city en el description y filtrar los resultados para los listados con un moderate cancellation_policy. La configuración de doesNotAffect garantiza que filtrar por un moderate cancellation_policy no 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.

1db.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.

Buscar con doesNotAffect en una faceta distinta del campo consultado.

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 city en su description y que tengan un cancellation_policy de moderate.

  • Facetas en los campos cancellation_policy, roomType y accommodates.

    Cada una de las facetas cancellation_policy y roomType tiene tres buckets, correspondientes a los tres valores únicos de estos campos en toda la colección. La consulta divide la accommodates faceta en agrupamientos para:

    • 1_, lĆ­mite inferior inclusivo para este cubo__

    • 2lĆ­mite superior exclusivo para el grupo 1 y lĆ­mite inferior inclusivo para este grupo.

    • 4lĆ­mite superior exclusivo para el grupo 2 y lĆ­mite inferior inclusivo para este grupo.

    • 8lĆ­mite superior exclusivo para el grupo 4

  • Establece la propiedad doesNotAffect en el Operador equals del compound.filter en accommodatesFacet. Esto excluye los cubos dentro de la faceta accommodates del filtrado. Como resultado, el filtrado en el moderate cancellation_policy reduce la cantidad de otros buckets en la faceta cancellation_policy a 0 y reduce la cantidad de buckets en la faceta roomType, pero la cantidad de buckets en la faceta accommodates no cambia. Esto permite comparar el impacto del filtrado en diferentes facetas.

1db.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]

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.

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