Definição
Sintaxe
compound tem a seguinte sintaxe:
{ $search: { "index": <index name>, // optional, defaults to "default" "compound": { <must | mustNot | should | filter>: [ { <clauses> } ], "score": <options>, "doesNotAffect": "<facet-to-exclude>" | [<array-of-facets>] } }}Cada cláusula must, mustNot, should e filter contém uma array de cláusulas secundárias. Use sintaxe de array mesmo se a array contiver apenas uma cláusula secundária. Consulte os exemplos nesta página.
Opções
compound usa os seguintes termos para construir uma consulta:
As cláusulas que devem corresponder a um documento a ser incluído nos resultados. A pontuação retornada é a soma das pontuações de todas as subqueries na cláusula. Mapeia para o operador booleano | |
As cláusulas que não devem corresponder para que um documento seja incluído nos resultados. As cláusulas Mapeia para o operador booleano | |
Cláusulas que você prefere corresponder em documentos incluídos nos resultados. Documentos que contêm uma correspondência com uma cláusula Se você usar mais de uma cláusula Veja um exemplo. Mapeia para o operador booleano Se você usar apenas o termo | |
As cláusulas que devem corresponder para que um documento seja incluído nos resultados. Cláusulas Por exemplo, você pode substituir o estágio Você pode usar a opção Veja outro exemplo de filtro. | |
| Modifique a pontuação de toda a cláusula |
| Faceta ou lista de facetas a serem excluídos do novo cálculo de contagem com base nesta query. O valor deve ser um ou mais nomes de uma faceta definidos em |
Uso
Você pode usar qualquer uma das cláusulas com qualquer operador de nível superior, como preenchimento automático, texto ou span, para especificar critérios de query.
Para otimizar o desempenho, coloque operadores que não pontuam, como igual, faixa e em, no termo filter para evitar operações de pontuação desnecessárias. Se você quiser executar várias operações que devem ser avaliadas como uma condição OR, aninhe um termo should dentro do nível superior filter.
Exemplo
[ { $search: { index: "default", compound: { filter: [ { compound: { should: [ { equals: { path: "accommodates", value: 2 } }, { range: { path: "pricePerNight", lte: 200 } } ] } } ] } } }]Comportamento de pontuação
O MongoDB Search classifica documentos no conjunto de resultados somando a pontuação que o documento recebeu para cada cláusula individual que gerou uma correspondência no documento. Somente os termos must e should participam da pontuação. O conjunto de resultados é ordenado por pontuação, da mais alta para a mais baixa.
A tabela seguinte mostra as cláusulas compound que contribuem e não contribuem para a pontuação.
Termo | Contribui para a pontuação |
|---|---|
| |
| |
| |
|
Você pode impulsionar ou substituir a pontuação de toda a query composta utilizando a opção score. Para obter um exemplo de substituição de toda a pontuação composta, consulte Exemplo de Pontuação Composta abaixo. Você também pode usar a pontuação para aumentar ou alterar a pontuação de cada subquery em cada cláusula. Para ver alguns exemplos de pontuações alteradas nas cláusulas do operador compound, consulte Modificar a Pontuação.
Exemplos
Você pode tentar os exemplos a seguir no MongoDB Search Playground ou em seu cluster.
Collection de amostras
Para executar as query de amostra nesta página, crie uma coleção chamada fruit em seu cluster e insira os seguintes documentos na coleção:
{ "_id" : 1, "type" : "apple", "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.", "category" : "nonorganic", "in_stock" : false},{ "_id" : 2, "type" : "banana", "description" : "Bananas are usually sold in bunches of five or six.", "category" : "nonorganic", "in_stock" : true},{ "_id" : 3, "type" : "pear", "description" : "Bosc and Bartlett are the most common varieties of pears.", "category" : "organic", "in_stock" : true}Índice de amostra
Para executar as query de amostra nesta página, crie o seguinte índice de pesquisa do MongoDB chamado default na coleção de amostra fruit. Esta definição de índice configura o MongoDB Search para fazer o seguinte:
Índice dinamicamente todos os campos na coleção
fruitusando o analisador padrão para extrair tokens. O analisadorstandardcoloca todas as palavras em letras minúsculas e desconsidera palavras vazias comuns, como"the","a","and"e assim por diante.
{ "mappings": { "dynamic": true, "fields": { "type": [ { "type": "string" }, { "type": "token" } ] } }}Exemplos de queries
As seguintes queries demonstram o operador $search compound nas queries do MongoDB Search.
must e Exemplo mustNot
O exemplo a seguir usa uma combinação das cláusulas must e mustNot para criar uma query. A cláusula must usa o operador de texto para procurar o termo varieties no campo description . Para que um documento corresponda, ele deve atender à cláusula must . A cláusula mustNot executa uma operação de pesquisa para o termo apples no campo description . Para que um documento corresponda, ele não deve atender à cláusula mustNot .
db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "mustNot": [{ "text": { "query": "apples", "path": "description" } }] } } }])A query acima retorna o documento com _id: 3 porque seu campo description contém a palavra varieties e não contém apples.
➤ Tente fazer isso no playground do MongoDB Search.
must e Exemplo should
As queries a seguir usam must para query as condições de procurar que devem ser atendidas e should para especificar a preferência para documentos que contêm a palavra Fuji.
Para essa query, o estágio do pipeline $project exclui todos os campos do documento, exceto _id, e adiciona um campo score, que exibe a pontuação de relevância do documento.
db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "Fuji", "path": "description" } }] } } }, { "$project": { "score": { "$meta": "searchScore" } } }])O documento com _id: 1 tem uma pontuação maior porque seu campo description contém a palavra Fuji, satisfazendo a cláusula should.
➤ Tente fazer isso no playground do MongoDB Search.
A query a seguir também especifica uma pontuação constant de 3 para todos os documentos nos resultados. Para essa query, o estágio do pipeline $project exclui todos os campos do documento, exceto _id, e adiciona um campo score .
db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "Fuji", "path": "description" } }], "score": { "constant": { "value": 3 } } } } }, { "$project": { "score": { "$meta": "searchScore" } } }])Ambos os documentos recebem a mesma pontuação porque a opção constant na query substitui a pontuação de cada documento no resultado pelo número 3.
➤ Tente fazer isso no playground do MongoDB Search.
exemplo MinimumShouldMatch
Em uma query com múltiplas cláusulas do should, você pode utilizar a opção miniumumShouldMatch para especificar um número mínimo de cláusulas que deve corresponder para retornar um resultado.
A seguinte query tem uma cláusula must e duas cláusulas should, com um valor minimumShouldMatch de 1. Um documento deve incluir o termo varieties no campo description e deve incluir Fuji ou Golden Delicious no campo de descrição para ser incluído no conjunto de resultados.
db.fruit.aggregate([ { $search: { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "Fuji", "path": "description" } }, { "text": { "query": "Golden Delicious", "path": "description" } }], "minimumShouldMatch": 1 } } }])O documento com _id: 1 corresponde à cláusula must e à primeira das duas cláusulas should.
➤ Tente fazer isso no playground do MongoDB Search.
filter Exemplos
filter comporta-se da mesma forma que must, exceto pelo fato de que a cláusula filter não é considerada na pontuação de um documento retornado e, portanto, não afeta a ordem dos documentos retornados.
A seguinte consulta utiliza as seguintes cláusulas:
mustefilterpara especificar as condições de pesquisa que devem ser atendidas.shouldpara especificar a preferência para documentos que contenham a palavrabanana. A cláusulashouldnão inclui a opçãominimumShouldMatch. Quando você omiteminimumShouldMatch, o padrão é0.
db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "banana", "path": "description" } }], "filter": [{ "text": { "query": "granny", "path": "description" } }] } } }])O documento retornado cumpre todos os requisitos para inclusão:
Tanto a cláusula
mustcomo a cláusulafiltercorrespondem.O valor
minimumShouldMatchnão é especificado, portanto o seu padrão é0. Como resultado, a cláusulashouldfalha e ainda retorna um documento.
➤ Tente fazer isso no playground do MongoDB Search.
Quando um estágio $match segue um estágio $search, você pode melhorar o desempenho da query movendo as condições de correspondência para uma cláusula filter dentro do estágio $search. O MongoDB Search aplica as condições filter durante a pesquisa em vez de verificar novamente o conjunto de resultados para executar o estágio $match.
Considere o seguinte pipeline, que pesquisa o campo description para o termo varieties e, em seguida, usa $match com $in para manter apenas maçãs e bananas:
db.fruit.aggregate([ { "$search": { "text": { "query": "varieties", "path": "description" } } }, { "$match": { "type": { "$in": [ "apple", "banana" ] } } }, { "$project": { "description": 1, "score": { "$meta": "searchScore" } } }])A query a seguir substitui o estágio $match por uma cláusula filter que usa o operador equals no campo type. O estágio $search usa o operador compound para combinar as seguintes cláusulas:
mustcláusula para corresponder ao termo de pesquisavarietiesno campodescriptionfiltercláusula para corresponder aos tiposappleebanana
O estágio $project faz o seguinte:
Exclui todos os campos, exceto
_idedescriptionAdiciona um campo
scoreque contém a pontuação de relevância do documento
db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "filter": [{ "in": { "path": "type", "value": [ "apple", "banana" ] } }] } } }, { "$project": { "description": 1, "score": { "$meta": "searchScore" } } }])Os documentos no resultado atendem a todos os requisitos para inclusão:
Ambos os documentos têm um valor
typedeappleoubanana, que é especificado na cláusulafilterda query.Um documento com
_id: 1tem uma pontuação maior que um documento com_id: 2porque contém o termovarietiesespecificado na cláusulashouldda query.
Exemplo aninhado
O exemplo seguinte utiliza cláusulas compound aninhadas para construir uma query. Neste exemplo, a collection fruit tem um índice nos campos type, category e in_stock, cujos campos de texto usam o analyzer padrão. A query exige que os documentos satisfaçam apenas uma das seguintes cláusulas should:
Contenha a palavra
appleno campotype.Contém o termo
organicno campocategorye o valortrueno campoin_stock.
db.fruit.aggregate([ { $search: { "compound": { "should": [ { "text": { "query": "apple", "path": "type" } }, { "compound": { "must": [ { "text": { "query": "organic", "path": "category" } }, { "equals": { "value": true, "path": "in_stock" } } ] } } ], "minimumShouldMatch": 1 } } }])Os documentos dos resultados atendem a todos os requisitos de inclusão:
O documento com
_id: 3corresponde à cláusulamustaninhada dentro da segunda cláusulashould.O documento com
_id: 1corresponde à primeira cláusulashould.
➤ Tente fazer isso no playground do MongoDB Search.
Exemplos de metadados
As consultas a seguir recuperam metadados para retornar o número de categorias na coleção fruit usando o estágio de pipeline $searchMeta ou a variável $$SEARCHMETA do estágio $search.
A query a seguir retorna apenas os metadados nos 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" } } } } }])A consulta a seguir retorna os metadados e os resultados da pesquisa.
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] } } }])