Docs Menu
Docs Home
/ /

compound Operador

compound

El operador compound combina dos o más operadores en una sola consulta. Cada elemento de una consulta compound se denomina cláusula y cada cláusula consta de una o más subconsultas. MongoDB Search proporciona una plantilla de consulta compuesta de ejemplo con instrucciones.

compound tiene la siguiente sintaxis:

1{
2 $search: {
3 "index": <index name>, // optional, defaults to "default"
4 "compound": {
5 <must | mustNot | should | filter>: [ { <clauses> } ],
6 "score": <options>
7 }
8 }
9}

Cada cláusula must, mustNot, should y filter contiene una matriz de subcláusulas. Utilice la sintaxis de matriz incluso si la matriz contiene solo una subcláusula. Consulte la ejemplos en esta página.

compound utiliza los siguientes términos para construir una consulta:

must

Cláusulas que deben coincidir para que un documento se incluya en los resultados. La puntuación obtenida es la suma de las puntuaciones de todas las subconsultas de la cláusula.

Se asigna al operador booleano AND.

mustNot

Cláusulas que no deben coincidir para que un documento se incluya en los resultados. Las cláusulas mustNot no contribuyen a la puntuación de un documento devuelto.

Se asigna al operador booleano AND NOT.

should

Cláusulas que prefiere buscar coincidencias en los documentos incluidos en los resultados. Los documentos que contienen una coincidencia con una cláusula should obtienen puntuaciones más altas que los documentos que no contienen una cláusula should. La puntuación obtenida es la suma de las puntuaciones de todas las subconsultas de la cláusula.

Si usa más de una cláusula should, puede usar la opción minimumShouldMatch para especificar un número mínimo de should cláusulas que deben coincidir para incluir un documento en los resultados. El valor de minimumShouldMatch debe ser menor o igual que el número de should cláusulas en la consulta. Si se omite, la opción minimumShouldMatch toma el valor predeterminado 0.

Ver un ejemplo.

Se asigna al operador booleano OR.

Si solo usa la cláusula should dentro de una consulta compuesta, el operador compound trata la matriz de las consultas de la cláusula should como un OR lógico. MongoDB Search debe encontrar una coincidencia con al menos un criterio should para devolver resultados. Al especificar varios criterios de la cláusula should con la opción minimumShouldMatch establecida en 0, MongoDB Search trata minimumShouldMatch como si estuviera establecido en 1 y debe coincidir con al menos un criterio para devolver resultados.

filter

Cláusulas que deben coincidir todas para que un documento se incluya en los resultados. Las cláusulas filter no contribuyen a la puntuación de un documento devuelto.

Por ejemplo, puede reemplazar la etapa$matchpor la etapa$searchutilizando la opción filter del operador compound. La siguiente etapa$matchfiltra los documentos con un valor determinado en el campo role:

$match: {
"role": { "$in": [ "CLIENT", "PROFESSIONAL" ] }
}

Puede utilizar la opción compound del operador filter en su lugar:

$search: {
"compound": {
"filter": [{
"queryString": {
"defaultPath": "role",
"query": "CLIENT OR PROFESSIONAL"
}
}]
}
}

Vea otro ejemplo de filtro.

score

Modifique la puntuación de toda la compound cláusula. Puede usar score para aumentar, reemplazar o modificar la puntuación. Si no score especifica, la puntuación devuelta será la suma de las puntuaciones de todas las subconsultas de las cláusulas must y should que generaron una coincidencia. Para obtener más información, consulte Comportamiento de la puntuación.

Puede utilizar cualquiera de las cláusulas con cualquier operador de nivel superior, como autocompletar, texto o intervalo, para especificar criterios de consulta.

Para optimizar el rendimiento, coloque operadores que no puntúen, como "igual", "rango" e "in", en la filter cláusula para evitar operaciones de puntuación innecesarias. Si desea ejecutar varias operaciones que deban evaluarse como una OR condición, anide una cláusula dentro de la cláusula de should nivel filter superior.

Ejemplo

[
{
$search: {
index: "default",
compound: {
filter: [
{
compound: {
should: [
{
equals: {
path: "accommodates",
value: 2
}
},
{
range: {
path: "pricePerNight",
lte: 200
}
}
]
}
}
]
}
}
}
]

MongoDB Search puntúa los documentos en el conjunto de resultados sumando la puntuación que el documento recibió para cada cláusula individual que generó una coincidencia en el documento. Solo las cláusulas must y should participan en la valoración. El conjunto de resultados está ordenado por puntuación, de mayor a menor.

La siguiente tabla muestra las cláusulas compound que contribuyen y no contribuyen a la puntuación.

Cláusula
Contribuye a la puntuación

filter

must

mustNot

should

Puede aumentar o reemplazar la puntuación de toda la consulta compuesta con la score opción. Para ver un ejemplo de cómo reemplazar la puntuación compuesta compound completa, consulte el ejemplo de puntuación compuesta a continuación. También puede usar la opción "score" para aumentar o modificar la puntuación de cada subconsulta en cada cláusula. Para ver algunos ejemplos de puntuaciones modificadas en cláusulas del operador, consulte "Modificar la puntuación".

Puedes probar los siguientes ejemplos en MongoDB Search Playground o en tu clúster.

Los ejemplos de esta página utilizan una colección llamada fruit, que contiene los siguientes documentos:

1{
2 "_id" : 1,
3 "type" : "apple",
4 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.",
5 "category" : "nonorganic",
6 "in_stock" : false
7},
8{
9 "_id" : 2,
10 "type" : "banana",
11 "description" : "Bananas are usually sold in bunches of five or six.",
12 "category" : "nonorganic",
13 "in_stock" : true
14},
15{
16 "_id" : 3,
17 "type" : "pear",
18 "description" : "Bosc and Bartlett are the most common varieties of pears.",
19 "category" : "organic",
20 "in_stock" : true
21}

La fruit colección tiene un índice predeterminado con asignaciones dinámicas que indexa automáticamente todos los campos de la colección y utiliza el analizador estándar predeterminado. El standard analizador convierte todas las palabras en minúsculas e ignora las palabras vacías comunes (,"the", "a", "and", etc.).

Las siguientes consultas demuestran el $search compound operador en las consultas de búsqueda de MongoDB.

El siguiente ejemplo utiliza una combinación de must mustNot cláusulas y para construir una consulta. La must cláusula utiliza el operador de texto para buscar el término varieties en el description campo. Para que un documento coincida, debe cumplir la must cláusula. La mustNot cláusula realiza una operación de búsqueda del término apples en el description campo. Para que un documento coincida,no debe cumplir la mustNot cláusula.

1db.fruit.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "must": [{
6 "text": {
7 "query": "varieties",
8 "path": "description"
9 }
10 }],
11 "mustNot": [{
12 "text": {
13 "query": "apples",
14 "path": "description"
15 }
16 }]
17 }
18 }
19 }
20])

La consulta anterior devuelve el documento con _id: 3 porque su campo description contiene la palabra varieties y no contiene apples.

➤ Pruebe esto en el patio de búsqueda de MongoDB.

Las siguientes consultas utilizan must para especificar las condiciones de búsqueda que se deben cumplir y should para especificar la preferencia por los documentos que contienen la palabra Fuji.

Para esta consulta, la etapa de canalización $project excluye todos los campos del documento excepto _id y agrega un campo score, que muestra el puntaje de relevancia del documento.

1db.fruit.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "must": [{
6 "text": {
7 "query": "varieties",
8 "path": "description"
9 }
10 }],
11 "should": [{
12 "text": {
13 "query": "Fuji",
14 "path": "description"
15 }
16 }]
17 }
18 }
19 },
20 {
21 "$project": {
22 "score": { "$meta": "searchScore" }
23 }
24 }
25])
{ "_id" : 1, "score" : 0.6425117254257202 }
{ "_id" : 3, "score" : 0.21649497747421265 }

El documento con _id: 1 tiene una puntuación más alta porque su campo description contiene la palabra Fuji, lo que satisface la cláusula should.

➤ Pruebe esto en el patio de búsqueda de MongoDB.

La siguiente consulta también especifica una puntuación constant de 3 para todos los documentos de los resultados. Para esta consulta, la $project etapa de canalización excluye todos los campos de documento excepto _id y añade un score campo.

1db.fruit.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "must": [{
6 "text": {
7 "query": "varieties",
8 "path": "description"
9 }
10 }],
11 "should": [{
12 "text": {
13 "query": "Fuji",
14 "path": "description"
15 }
16 }],
17 "score": { "constant": { "value": 3 } }
18 }
19 }
20 },
21 {
22 "$project": {
23 "score": { "$meta": "searchScore" }
24 }
25 }
26])
[ { _id: 1, score: 3 }, { _id: 3, score: 3 } ]

Ambos documentos reciben la misma puntuación porque la opción constant en la consulta reemplaza la puntuación de cada documento en el resultado con el número 3.

➤ Pruebe esto en el patio de búsqueda de MongoDB.

En una consulta con múltiples cláusulas should, puede utilizar la opción miniumumShouldMatch para especificar un número mínimo de cláusulas que deben coincidir para devolver un resultado.

La siguiente consulta tiene una cláusula must y dos cláusulas should, con un valor minimumShouldMatch de 1. Un documento debe incluir el término varieties en el campo description y debe incluir Fuji o Golden Delicious en el campo de descripción para ser incluido en el conjunto de resultados.

1db.fruit.aggregate([
2 {
3 $search: {
4 "compound": {
5 "must": [{
6 "text": {
7 "query": "varieties",
8 "path": "description"
9 }
10 }],
11 "should": [{
12 "text": {
13 "query": "Fuji",
14 "path": "description"
15 }
16 },
17 {
18 "text": {
19 "query": "Golden Delicious",
20 "path": "description"
21 }
22 }],
23 "minimumShouldMatch": 1
24 }
25 }
26 }
27])
1{
2 "_id" : 1,
3 "type" : "apple",
4 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.",
5 "category" : "nonorganic",
6 "in_stock" : false
7}

El documento con _id: 1 coincide con la cláusula must y la primera de las dos cláusulas should.

➤ Pruebe esto en el patio de búsqueda de MongoDB.

filter se comporta igual que must, excepto que la cláusula filter no se considera en la puntuación de un documento devuelto y, por lo tanto, no afecta el orden de los documentos devueltos.

La siguiente consulta utiliza las siguientes cláusulas:

  • must y filter para especificar las condiciones de búsqueda que deben cumplirse.

  • should Para especificar la preferencia por documentos que contienen la palabra banana. La cláusula should no incluye la opción minimumShouldMatch. Si se omite minimumShouldMatch, el valor predeterminado es 0.

1db.fruit.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "must": [{
6 "text": {
7 "query": "varieties",
8 "path": "description"
9 }
10 }],
11 "should": [{
12 "text": {
13 "query": "banana",
14 "path": "description"
15 }
16 }],
17 "filter": [{
18 "text": {
19 "query": "granny",
20 "path": "description"
21 }
22 }]
23 }
24 }
25 }
26])
1{
2 "_id" : 1,
3 "type" : "apple",
4 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.",
5 "category" : "nonorganic",
6 "in_stock" : false
7}

El documento devuelto cumple todos los requisitos para su inclusión:

  • Tanto la cláusula must como la cláusula filter coinciden.

  • El valor minimumShouldMatch no está especificado, por lo que su valor por defecto será 0. Como resultado, la cláusula should falla y aún así devuelve un documento.

➤ Pruebe esto en el patio de búsqueda de MongoDB.

Puede reemplazar por $match $in en sus consultas sobre los datos de su clúster con la filter cláusula. La siguiente consulta muestra cómo usar filter en la $search etapa para especificar los términos de búsqueda que deben coincidir. La consulta también usa should para especificar la preferencia por los documentos que contienen el varieties término. La consulta incluye la $project etapa de canalización para realizar lo siguiente:

  • Excluir todos los campos excepto _id y description.

  • Agregue un campo score, que muestra la puntuación de relevancia del documento.

1db.fruit.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "filter": [{
6 "text": {
7 "query": ["apples", "bananas"],
8 "path": "description"
9 }
10 }],
11 "should": [{
12 "text": {
13 "query": "varieties",
14 "path": "description"
15 }
16 }]
17 }
18 }
19 },
20 {
21 "$project": {
22 "description": 1,
23 "score": { "$meta": "searchScore" }
24 }
25 }
26])
1[
2 {
3 _id: 1,
4 description: 'Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp. The most popular varieties are McIntosh, Gala, and Granny Smith.',
5 score: 0.36074575781822205
6 },
7 {
8 _id: 2,
9 description: 'Bananas are usually sold in bunches of five or six.',
10 score: 0
11 }
12]

Los documentos en el resultado cumplen con todos los requisitos para su inclusión:

  • Ambos documentos contienen el término apples o bananas que se especificó en la cláusula filter de la consulta.

  • El documento con _id: 1 tiene una puntuación más alta que el documento con _id: 2 porque contiene el término varieties especificado en la cláusula should de la consulta.

➤ Pruebe esto en el patio de búsqueda de MongoDB.

El siguiente ejemplo utiliza compound cláusulas anidadas para construir una consulta. En este ejemplo, la fruit colección tiene un índice en los type category in_stock campos, y, cuyos campos de texto utilizan el analizador predeterminado. La consulta requiere que los documentos solo cumplan una de las siguientes should cláusulas:

  • Contiene la palabra apple en el campo type.

  • Contiene el término organic en el campo category y tiene el valor true en el campo in_stock.

1db.fruit.aggregate([
2 {
3 $search: {
4 "compound": {
5 "should": [
6 {
7 "text": {
8 "query": "apple",
9 "path": "type"
10 }
11 },
12 {
13 "compound": {
14 "must": [
15 {
16 "text": {
17 "query": "organic",
18 "path": "category"
19 }
20 },
21 {
22 "equals": {
23 "value": true,
24 "path": "in_stock"
25 }
26 }
27 ]
28 }
29 }
30 ],
31 "minimumShouldMatch": 1
32 }
33 }
34 }
35])
1{
2 "_id" : 3,
3 "type" : "pear",
4 "description" : "Bosc and Bartlett are the most common varieties of pears.",
5 "category" : "organic",
6 "in_stock" : true
7}
8{
9 "_id" : 1,
10 "type" : "apple",
11 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.",
12 "category" : "nonorganic",
13 "in_stock" : false
14}

Los documentos incluidos en los resultados cumplen todos los requisitos para su inclusión:

  • El documento con _id: 3 coincide con la cláusula must anidada dentro de la segunda cláusula should.

  • El documento con _id: 1 coincide con la primera cláusula should.

➤ Pruebe esto en el patio de búsqueda de MongoDB.

Las siguientes consultas recuperan metadatos para devolver la cantidad de categorías en la colección fruit utilizando la etapa de canalización $searchMeta o la variable $$SEARCHMETA de la etapa $search.

La siguiente query solo devuelve los metadatos en los resultados.

db.fruit.aggregate([
{
"$searchMeta": {
"facet": {
"operator": {
"compound": {
"must": [{
"text": {
"query": "varieties",
"path": "description"
}
}],
"should": [{
"text": {
"query": "Fuji",
"path": "description"
}
}]
}
},
"facets": {
"categoryFacet": {
"type": "string",
"path": "category"
}
}
}
}
}
])
[
{
count: { lowerBound: Long('2') },
facet: {
categoryFacet: {
buckets: [
{ _id: 'nonorganic', count: Long('1') },
{ _id: 'organic', count: Long('1') }
]
}
}
}
]

La siguiente consulta devuelve los metadatos y los resultados de la búsqueda.

db.fruit.aggregate([
{
"$search": {
"facet": {
"operator": {
"compound": {
"must": [{
"text": {
"query": "varieties",
"path": "description"
}
}],
"should": [{
"text": {
"query": "Fuji",
"path": "description"
}
}]
}
},
"facets": {
"categoryFacet": {
"type": "string",
"path": "category"
}
}
}
}
},
{ "$limit": 2 },
{
"$facet": {
"docs": [
{ "$project":
{
"type": 1,
"description": 1
}
}
],
"meta": [
{"$replaceWith": "$$SEARCH_META"},
{"$limit": 1}
]
}
},
{
"$set": {
"meta": {
"$arrayElemAt": ["$meta", 0]
}
}
}
])
[
{
docs: [
{
_id: 1,
type: 'apple',
description: 'Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.'
},
{
_id: 3,
type: 'pear',
description: 'Bosc and Bartlett are the most common varieties of pears.'
}
],
meta: {
count: { lowerBound: Long('2') },
facet: {
categoryFacet: {
buckets: [
{ _id: 'nonorganic', count: Long('1') },
{ _id: 'organic', count: Long('1') }
]
}
}
}
}
]

Volver

Autocompletar

En esta página