Definición
Sintaxis
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 "doesNotAffect": "<facet-to-exclude>" | [<array-of-facets>] 8 } 9 } 10 }
Cada cláusula must, mustNot, should y filter contiene un arreglo de subcláusulas. Utiliza la sintaxis de arreglos incluso si el arreglo contiene solo una subcláusula. Ver el ejemplos en esta página.
opciones
compound utiliza los siguientes términos para construir una query:
Cláusulas que deben coincidir para que un documento se incluya en los resultados. La puntuación devuelta es la suma de las puntuaciones de todas las subconsultas en la cláusula. Se corresponde con el operador booleano | ||||||||||||||
Cláusulas que no deben coincidir para que un documento se incluya en los resultados. Las cláusulas Se corresponde con el operador booleano | ||||||||||||||
Cláusulas que prefieres que coincidan en los documentos que se incluyen en los resultados. Los documentos que contienen una coincidencia para una cláusula Si utiliza más de una cláusula Ver un ejemplo. Se corresponde con el operador booleano Si solo usas la cláusula | ||||||||||||||
Cláusulas que deben coincidir para que un documento se incluya en los resultados. Las cláusulas Por ejemplo, puedes sustituir la etapa En vez de eso, puedes usar la Consulta otro ejemplo de filtro. | ||||||||||||||
| Modifique la puntuación de toda la cláusula | |||||||||||||
| Faceta o lista de facetas que se excluirán del recálculo de recuento según esta consulta. El valor debe ser uno o más nombres de una faceta definida en |
Uso
Puedes utilizar cualquiera de las cláusulas con cualquier operador de nivel superior, como autocompletar, texto o fragmento, para especificar los criterios de la query.
Para optimizar el rendimiento, coloca operadores sin puntuación como igual, rango, e en en la cláusula filter para evitar operaciones de puntuación innecesarias. Si deseas ejecutar varias operaciones que deben evaluarse como una condición OR, anida una cláusula should dentro del filterde primer nivel.
Ejemplo
[ { $search: { index: "default", compound: { filter: [ { compound: { should: [ { equals: { path: "accommodates", value: 2 } }, { range: { path: "pricePerNight", lte: 200 } } ] } } ] } } } ]
Comportamiento de la puntuación
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 compound cláusulas que contribuyen y que no contribuyen a la puntuación.
Cláusula | Contribuye a la puntuación |
|---|---|
| |
| |
| |
|
Puedes aumentar o reemplazar la puntuación de toda la consulta compuesta con la opción score. Consulta un ejemplo de cómo reemplazar toda la puntuación compuesta en Ejemplo de puntuación compuesta a continuación. Puedes usar la puntuación para aumentar o modificar también la puntuación de cada subconsulta de cada cláusula. Consulta algunos ejemplos de puntuaciones alteradas en cláusulas del operador compound en Modificación de la puntuación.
Ejemplos
Puedes probar los siguientes ejemplos en MongoDB Search Playground o en tu clúster.
Colección de muestra
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 }
Índice de muestra
La colección fruit tiene un índice predeterminado con mapeo dinámico que indexa automáticamente todos los campos de la colección y utiliza el analizador estándar por defecto. El analizador standard convierte todas las palabras a minúsculas y omite las palabras vacías comunes ("the", "a", "and",, etc.).
Queries de muestra
Las siguientes consultas demuestran el operador $search compound en las consultas de MongoDB Search.
must y mustNot Ejemplo
El siguiente ejemplo utiliza una combinación de cláusulas must y mustNot para construir una query. La cláusula must utiliza el operador de texto para buscar el término varieties en el campo description. Para que un documento coincida, debe cumplir con la cláusula must. La cláusula mustNot realiza una operación de búsqueda del término apples en el campo description. Para que un documento coincida, no debe cumplir la cláusula mustNot.
1 db.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 query anterior devuelve el documento con _id: 3 porque su campo description contiene la palabra varieties y no contiene apples.
➤ Prueba esto en el Playground de MongoDB Search.
must y should Ejemplo
Las siguientes queries usan must para especificar las condiciones de búsqueda que deben cumplirse y should para especificar la preferencia para los documentos que contienen la palabra Fuji.
Para esta query, la etapa de pipeline $project excluye todos los campos del documento excepto _id y añade un campo score, que muestra la puntuación de relevancia del documento.
1 db.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 obtiene una puntuación más alta porque su campo description contiene la palabra Fuji, satisfaciendo la cláusula should.
➤ Prueba esto en el Playground de MongoDB Search.
La siguiente query también especifica una puntuación de constant de 3 para todos los documentos en los resultados. Para esta query, la etapa de pipeline $project excluye todos los campos de documentos excepto _id y añade un campo score.
1 db.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 query reemplaza la puntuación de cada documento en el resultado por el número 3.
➤ Prueba esto en el Playground de MongoDB Search.
Ejemplo de minimumShouldMatch
En una query con varias cláusulas should, se 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.
1 db.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.
➤ Prueba esto en el Playground de MongoDB Search.
filter Ejemplos
filter se comporta igual que must, salvo que la cláusula filter no se tiene en cuenta en la puntuación de un documento devuelto y, por lo tanto, no afecta el orden de los documentos devueltos.
La siguiente query utiliza las siguientes cláusulas:
mustyfilterpara especificar las condiciones de búsqueda que deben cumplirse.shouldpara especificar preferencia por documentos que contengan la palabrabanana. La cláusulashouldno incluye la opciónminimumShouldMatch. Cuando omitasminimumShouldMatch, se establecerá por defecto en0.
1 db.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
mustcomo lafiltercoinciden.El valor
minimumShouldMatchno está especificado, por lo que su valor por defecto será0. Como resultado, la cláusulashouldfalla y aún así devuelve un documento.
➤ Prueba esto en el Playground de MongoDB Search.
Puede reemplazar el $match con $in en sus consultas sobre datos de su clúster con la cláusula filter. La siguiente consulta demuestra cómo utilizar filter en la etapa $search para especificar los términos de búsqueda que deben coincidir. La query también utiliza should para especificar preferencia por documentos que contengan el término varieties. La query incluye la etapa de pipeline $project para realizar lo siguiente:
Exceptuar todos los campos excepto
_idydescription.Añada un campo
score, que muestra la puntuación de relevancia del documento.
1 db.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
applesobananasque se especificó en la cláusulafilterde la query.Un documento con
_id: 1obtiene una puntuación mayor que un documento con_id: 2porque contiene el términovarietiesespecificado en la cláusulashouldde la query.
➤ Prueba esto en el Playground de MongoDB Search.
Ejemplo anidado
En el siguiente ejemplo se utilizan cláusulas anidadas compound para construir una query. En este ejemplo, la colección fruit tiene un índice en los campos type, category y in_stock, cuyos campos de texto usan el analizador por defecto. La query requiere que los documentos solo cumplan una de las siguientes cláusulas should:
Contener la palabra
appleen el campotype.Incluye el término
organicen el campocategoryy el valortrueen el campoin_stock.
1 db.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 en los resultados cumplen todos los requisitos para su inclusión:
El documento con
_id: 3coincide con la cláusulamustanidada dentro de la segunda cláusulashould.El documento con
_id: 1coincide con la primerashouldcláusula.
➤ Prueba esto en el Playground de MongoDB Search.
Ejemplos de metadatos
Las siguientes consultas recuperan metadatos para devolver el número de categorías en la colección fruit utilizando la fase de pipeline $searchMeta o la variable $$SEARCHMETA de la fase $search.