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

documento incorporado

Nesta página

  • Definição
  • Sintaxe
  • Opções
  • Comportamento
  • Comportamento de pontuação
  • Comportamento de classificação
  • Realce
  • Limitações
  • Exemplos
  • Definição de Índice
  • Query básica
  • Query facet
  • Query e classificação
  • Query apenas para documentos incorporados correspondentes

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.

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. O embeddedDocument pode ser utilizado somente para queries sobre campos do tipo embeddedDocuments .

embeddedDocument tem a seguinte sintaxe:

{
"embeddedDocument": {
"path": "<path-to-field>",
"operator": { <operator-specification> },
"score": { <score-options> }
}
}

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

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:

  1. Avalia cada documento incorporado na array de forma independente.

  2. 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ção embedded.

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

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:

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.

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.

Você não pode fazer realces em consultas dentro do operador embeddedDocument.

Os exemplos seguintes utilizam a collection sample_supplies.sales no conjunto de dados de amostra.

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"
}
}
}
}

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 e items.tags

  • Adicione um campo chamado score

1db.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})

A query abaixo pesquisa itens marcados com school , com preferência para itens denominados backpack. Ele solicita informações de facet no campo purchaseMethod .

1db.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})

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 e items.tags

  • Adicione um campo chamado score

1db.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})

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 must :

  • Verifique se o campo items.price existe na coleção.

  • Procure os itens marcados como office no campo items.tags .

  • Corresponde somente se o valor for maior que 2 para o campo items.quantity .

Limita a saída a 5 documentos.

Execute as seguintes ações:

  • Exclua o campo _id e inclua somente os campos items e storeLocation .

  • Use $filter para retornar somente elementos da array de entrada items que correspondam à condição especificada usando o operador $and . O operador and utiliza os seguintes operadores:

    • $ifNull para determinar se items.price contém valores nulos e substituir os valores nulos, se presentes, pela expressão de substituição false.

    • $gt para verificar se a quantidade é maior que 2.

    • $in para verificar se office existe na array tags .

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

Voltar

composto

Próximo

é igual a