Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/ / / /

composto

Nesta página

  • Definição
  • Sintaxe
  • Opções
  • Uso
  • Comportamento de pontuação
  • Exemplos
compound

O operador compound combina dois ou mais operadores em uma única query. Cada elemento de uma query compound é chamado de cláusula e cada cláusula consiste em uma ou mais subqueries. O Atlas Search fornece um modelo de query composta de amostra com orientação. Para saber mais, consulte Modelo de orientação de query de visualização.

compound tem a seguinte sintaxe:

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

compound usa os seguintes termos para construir uma consulta:

must

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

mustNot

As cláusulas que não devem corresponder para que um documento seja incluído nos resultados. As cláusulas mustNot não contribuem para a pontuação de um documento devolvido.

Mapeia para o operador booleano AND NOT.

should

Cláusulas que você prefere corresponder em documentos incluídos nos resultados. Documentos que contêm uma correspondência com uma cláusula should têm pontuações mais altas do que documentos que não contêm uma cláusula should. A pontuação retornada é a soma das pontuações de todas as subqueries na cláusula.

Se você usar mais de uma cláusula should , poderá usar a opção minimumShouldMatch para especificar um número mínimo de cláusulas should que devem corresponder para incluir um documento nos resultados. Se omitido, a opção minimumShouldMatch será padronizada como 0.

Veja um exemplo.

Mapeia para o operador booleano OR.

Se você usar apenas o termo should em uma query composta, o operador compound tratará a array das queries do termo should como um OR lógico. O Atlas Search deve encontrar uma correspondência para pelo menos um critério should para retornar qualquer resultado. Quando você especifica vários critérios de cláusula de should com a opção minimumShouldMatch definida como 0, o Atlas Search trata minimumShouldMatch como definida como 1 e deve corresponder a pelo menos um critério para retornar quaisquer resultados.

filter

As cláusulas que devem corresponder para que um documento seja incluído nos resultados. Cláusulas filter não contribuem para a pontuação de um documento devolvido.

Por exemplo, você pode substituir o estágio $match pelo estágio $search usando a opção compound do operador filter . Os seguintes filtros de estágio $match para documentos com um valor fornecido para o campo role:

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

Você pode usar a opção compound do operador filter :

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

Veja outro exemplo de filtro.

score
Modifique a pontuação de toda a cláusula compound. Você pode usar score para impulsionar, substituir ou alterar a pontuação. Se você não especificar score, a pontuação retornada será a soma das pontuações de todas as subqueries nas cláusulas must e should que tiveram correspondência. Para saber mais, consulte Comportamento de pontuação.

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.

O Atlas 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
Não contribui para a pontuação
filter
must
mustNot
should

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.

Você pode tentar os seguintes exemplos no Atlas Search Playground ou no seu cluster do Atlas.

Os exemplos nesta página usam uma coleção chamada fruit, que contém os seguintes 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}

A collection fruit tem um índice padrão com mapeamentos dinâmicos que indexa automaticamente todos os campos na collection e usa o analyzer padrão . O analyzer standard coloca todas as palavras em letras minúsculas e desconsidera as palavras de parada comuns ("the", "a", "and", etc.).

As seguintes queries demonstram o operador $search compound nas queries do Atlas Search.

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 .

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

A query acima retorna o documento com _id: 3 porque seu campo description contém a palavra varieties e não contém apples.

➤ Experimente isso no Atlas Search Playground.

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.

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

O documento com _id: 1 tem uma pontuação maior porque seu campo description contém a palavra Fuji, satisfazendo a cláusula should.

➤ Experimente isso no Atlas Search Playground.

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 .

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

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.

➤ Experimente isso no Atlas Search Playground.

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.

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

O documento com _id: 1 corresponde à cláusula must e à primeira das duas cláusulas should.

➤ Experimente isso no Atlas Search Playground.

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:

  • must e filter para especificar as condições de pesquisa que devem ser atendidas.

  • should para especificar a preferência para documentos que contenham a palavra banana. A cláusula should não inclui a opção minimumShouldMatch . Quando você omite minimumShouldMatch, o padrão é 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])

O documento retornado cumpre todos os requisitos para inclusão:

  • Tanto a cláusula must como a cláusula filter correspondem.

  • O valor minimumShouldMatch não é especificado, portanto o seu padrão é 0. Como resultado, a cláusula should falha e ainda retorna um documento.

➤ Experimente isso no Atlas Search Playground.

Você pode substituir $match por $in em suas queries em relação aos dados do Atlas cluster com a cláusula filter . A seguinte query demonstra como utilizar filter no estágio $search para especificar os termos de pesquisa que devem corresponder. A query também usa should para especificar a preferência para documentos que contenham o termo varieties. A query inclui o estágio de pipeline $project para fazer o seguinte:

  • Excluir todos os campos, exceto _id e description.

  • Adicione um campo score , que exibe a pontuação de relevância do 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])

Os documentos no resultado cumprem todos os requisitos para inclusão:

  • Ambos os documentos contêm o termo apples ou bananas que foi especificado na cláusula filter da query.

  • O documento com _id: 1 pontuações mais altas do que o documento com _id: 2 porque contém o termo varieties especificado na cláusula should da query.

➤ Experimente isso no Atlas Search Playground.

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 apple no campo type.

  • Contém o termo organic no campo category e o valor true no 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])

Os documentos dos resultados atendem a todos os requisitos de inclusão:

  • O documento com _id: 3 corresponde à cláusula must aninhada dentro da segunda cláusula should.

  • O documento com _id: 1 corresponde à primeira cláusula should.

➤ Experimente isso no Atlas Search Playground.

Voltar

autocompletar