documento incorporado
Nesta página
Observação
A opção de índice embeddedDocuments do Atlas Search, o operadorembeddedDocument e a opção de pontuação embedded
estão em pré-visualização. Quando um índice do Atlas Search em um conjunto de réplicas ou shard do MongoDB atinge o limite de dois bilhões de documentos do Lucene, o Atlas Search não indexa novos documentos nem aplica atualizações a documentos existentes para esse índice. Uma solução para acomodar essa limitação será implementada quando esse recurso estiver geralmente disponível. Para solucionar qualquer problema relacionado ao uso dessa funcionalidade, entre em contato com o Suporte.
Definição
embeddedDocument
O operador
embeddedDocument
é semelhante ao operador $elemMatch . Ele restringe vários predicados da query a serem satisfeitos a partir de um único elemento de um array de documentos incorporados. OembeddedDocument
pode ser utilizado somente para queries sobre campos do tipo embeddedDocuments .
Sintaxe
embeddedDocument
tem a seguinte sintaxe:
{ "embeddedDocument": { "path": "<path-to-field>", "operator": { <operator-specification> }, "score": { <score-options> } } }
Opções
embeddedDocument
usa as seguintes opções para construir uma query:
Campo | Tipo | Descrição | necessidade |
---|---|---|---|
operator | objeto | Operador a utilizar para fazer a query de cada documento no array de documentos que você especifica no path . O operador moreLikeThis não é aceito. | Obrigatório |
path | string | Campo de tipo embeddedDocuments indexado para pesquisa. O campo especificado deve ser pai de todos os operadores e campos especificados utilizando a opção operator . Para obter mais informações, consulte Construção de caminho. | Obrigatório |
score | objeto | Pontuação a ser atribuída aos resultados correspondentes do Atlas Search . Você pode utilizar a opção de pontuação embedded para configurar as opções de pontuação. Para saber mais, consulte Comportamento de pontuação. | Opcional |
Comportamento
Quando você faz uma query de documentos incorporados a arrays usando o operador embeddedDocument
, o Atlas Search avalia e pontua os predicados da query do operador em diferentes estágios de sua execução. Atlas Search:
Avalia cada documento incorporado na array de forma independente.
Combina as pontuações dos resultados correspondentes conforme configurado usando a opção
embedded
ou as pontuações somando as pontuações dos resultados correspondentes se você não especificar uma opção de pontuaçãoembedded
.Associa os resultados correspondentes ao documento-pai se outros predicados da query forem especificados pelo operador composto.
Observação
Para facetar strings, o Atlas Search conta as facets da string uma vez para cada documento no conjunto de resultados. Para ver um exemplo desse comportamento, consulte Exemplos.
Comportamento de pontuação
Por padrão, o operador embeddedDocument
usa a estratégia de agregação padrão, sum
, para combinar pontuações de correspondências de documentos incorporados. A opção embeddedDocument
do operador score
permite que você substitua o padrão e configure a pontuação dos resultados correspondentes utilizando a opção embedded
.
Dica
Veja também:
Comportamento de classificação
Para classificar os documentos-pai por um campo de documento incorporado, faça o seguinte:
Indexe os pais do campo filho do documento incorporado como o tipo de documento .
Indexe o campo filho com valores de string dentro do documento incorporado como o tipo de token . Para campos filho com valores de número e data, habilite o mapeamento dinâmico para indexar esses campos automaticamente.
O Atlas Search classifica somente em documentos pai. Não classifica os campos filhos em uma array de documentos. Para obter um exemplo, consulte Exemplo de classificação.
Realce
Você pode fazer realces em campos se os campos forem indexados em um campo principal do tipo de documento para predicados de consulta especificados dentro do operador embeddedDocument
. Para ver um exemplo, consulte tutorial.
Limitações
Você não pode fazer realces em consultas dentro do operador embeddedDocument
.
Exemplos
Os exemplos seguintes utilizam a collection sample_supplies.sales
no conjunto de dados de amostra.
Definição de Índice
Essas queries de exemplo usam a seguinte definição de índice na collection:
{ "mappings": { "dynamic": true, "fields": { "items": [ { "dynamic": true, "type": "embeddedDocuments" }, { "dynamic": true, "fields": { "tags": { "type": "token" } }, "type": "document" } ], "purchaseMethod": { "type": "stringFacet" } } } }
Query básica
A query abaixo pesquisa a collection por itens marcados com school
, com preferência para itens denominados backpack
. O Atlas Search pontua os resultados em ordem decrescente com base na pontuação média (média aritmética) de todos os documentos incorporados correspondentes. A query inclui um estágio de $limit
para limitar o resultado a 5
documentos e um estágio de $project
para:
Excluir todos os campos, exceto campos
items.name
eitems.tags
Adicione um campo chamado
score
1 db.sales.aggregate({ 2 "$search": { 3 "embeddedDocument": { 4 "path": "items", 5 "operator": { 6 "compound": { 7 "must": [{ 8 "text": { 9 "path": "items.tags", 10 "query": "school" 11 } 12 }], 13 "should": [{ 14 "text": { 15 "path": "items.name", 16 "query": "backpack" 17 } 18 }] 19 } 20 }, 21 "score": { 22 "embedded": { 23 "aggregate": "mean" 24 } 25 } 26 } 27 } 28 }, 29 { 30 $limit: 5 31 }, 32 { 33 $project: { 34 "_id": 0, 35 "items.name": 1, 36 "items.tags": 1, 37 "score": { $meta: "searchScore" } 38 } 39 })
Query facet
A query abaixo pesquisa itens marcados com school
, com preferência para itens denominados backpack
. Ele solicita informações de facet no campo purchaseMethod
.
1 db.sales.aggregate({ 2 "$searchMeta": { 3 "facet": { 4 "operator": { 5 "embeddedDocument": { 6 "path": "items", 7 "operator": { 8 "compound": { 9 "must": [ 10 { 11 "text": { 12 "path": "items.tags", 13 "query": "school" 14 } 15 } 16 ], 17 "should": [ 18 { 19 "text": { 20 "path": "items.name", 21 "query": "backpack" 22 } 23 } 24 ] 25 } 26 } 27 } 28 }, 29 "facets": { 30 "purchaseMethodFacet": { 31 "type": "string", 32 "path": "purchaseMethod" 33 } 34 } 35 } 36 } 37 })
Query e classificação
A seguinte query pesquisa itens denominados laptop
e classifica os resultados pelo campo items.tags
. A query inclui um estágio de $limit
para limitar o resultado a 5
documentos e um estágio de $project
para:
Excluir todos os campos, exceto
items.name
eitems.tags
Adicione um campo chamado
score
1 db.sales.aggregate({ 2 "$search": { 3 "embeddedDocument": { 4 "path": "items", 5 "operator": { 6 "text": { 7 "path": "items.name", 8 "query": "laptop" 9 } 10 } 11 }, 12 "sort": { 13 "items.tags": 1 14 } 15 } 16 }, 17 { 18 "$limit": 5 19 }, 20 { 21 "$project": { 22 "_id": 0, 23 "items.name": 1, 24 "items.tags": 1, 25 "score": { "$meta": "searchScore" } 26 } 27 })
Query apenas para documentos incorporados correspondentes
A query a seguir retorna somente os documentos aninhados que correspondem à query. A query usa as cláusulas do operador composto do Atlas Search no estágio $search
para encontrar documentos correspondentes e, em seguida, os operadores de agregação no estágio $project
para retornar somente os documentos incorporados correspondentes. Especificamente, a query especifica os seguintes estágios de pipeline:
Especifica os seguintes critérios na cláusula do operador composto
| |
Limita a saída a 5 documentos. | |
1 db.sales.aggregate( 2 { 3 "$search": { 4 "embeddedDocument": { 5 "path": "items", 6 "operator": { 7 "compound": { 8 "must": [ 9 { 10 "range": { 11 "path": "items.quantity", 12 "gt": 2 13 } 14 }, 15 { 16 "exists": { 17 "path": "items.price" 18 } 19 }, 20 { 21 "text": { 22 "path": "items.tags", 23 "query": "school" 24 } 25 } 26 ] 27 } 28 } 29 } 30 } 31 }, 32 { 33 "$limit": 2 34 }, 35 { 36 "$project": { 37 "_id": 0, 38 "storeLocation": 1, 39 "items": { 40 "$filter": { 41 "input": "$items", 42 "cond": { 43 "$and": [ 44 { 45 "$ifNull": [ 46 "$$this.price", "false" 47 ] 48 }, 49 { 50 "$gt": [ 51 "$$this.quantity", 2 52 ] 53 }, 54 { 55 "$in": [ 56 "office", "$$this.tags" 57 ] 58 } 59 ] 60 } 61 } 62 } 63 } 64 } 65 )
Dica
Para retornar somente documentos incorporados correspondentes nos resultados, inclua um $filter
equivalente para corresponder aos critérios $search
no campo de documento incorporado. Para retornar apenas documentos incorporados correspondentes nos resultados do estágio $search
, vote a favor dessa solicitação no MongoDB Feedback Engine.