Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
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

Información para agrupar los datos de 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 10000. 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.

type

string

Tipo de faceta. El valor debe ser string.

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

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

List of numeric values in ascending order that specify the boundaries for your buckets. You must specify between two and ten thousand ([2, 10000]) boundary values. Each adjacent pair of values defines a bucket with an inclusive lower bound and an exclusive upper bound. You can specify any combination of values of the following BSON types:

  • entero de 32 bits (int32)

  • entero de 64 bits (int64)

  • punto flotante binario de 64 bits (double)

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.

type

string

Tipo de faceta. El valor debe ser number.

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

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

  • At least two boundaries, which are less than or equal to ten thousand ([2, 10000])

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

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.

type

string

Tipo de faceta. El valor debe ser date.

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.

Finally, for use cases with many facets, you can limit which other filters affect a given facet. You can do this by specifying any facet in the doesNotAffect property of any filter, including facets on other fields. This allows you to observe at a glance which selections narrow options more or less quickly.

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 más información, consulte el Ejemplo de exclusión de filtros 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 consulta de $searchMeta 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 tanto los resultados de búsqueda como los de metadatos. El returnScope ejemplo demuestra cómo clasificar 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": true,
"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 accommodatesFacet: {
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('11') }
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 accommodatesFacet: {
6 buckets: [
7 { _id: 1, count: Long('141') },
8 { _id: 2, count: Long('834') },
9 { _id: 4, count: Long('703') }
10 ]
11 },
12 cancellationFacet: {
13 buckets: [
14 { _id: 'moderate', count: Long('531') }
15 ]
16 },
17 roomTypeFacet: {
18 buckets: [
19 { _id: 'Entire home/apt', count: Long('369') },
20 { _id: 'Private room', count: Long('159') },
21 { _id: 'Shared room', count: Long('3') }
22 ]
23 }
24 }
25 }
26]

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.

Watch this video to learn about how you can create and use a numeric and string facet (MongoDB Search Operator) in your query to group results and retrieve a count of the results in the groups.

Duración: 11 minutos