Como indexar campos em arrays de objetos e documentos
Nesta página
Observação
O tipo embeddedDocuments do Atlas Search , ooperadorembeddedDocument embedded
e a opção de pontuação estão em pré-visualização. Quando um índice do Atlas Search em um conjunto de réplicas ou em um único shard do MongoDB atinge 2, ,100,000 000 objetos de índice, o Atlas Search transita o índice para um estado obsoleto e consultável. Se você quiser que o Atlas Search suporte a mais de 2,100,000,000 objetos de índice no futuro, vote nessa solicitação no MongoDB Feedback Engine.
Você pode usar o tipo embeddedDocuments
do Atlas Search para indexar campos em documentos e objetos que são elementos de uma array. O Atlas Search indexa documentos incorporados independente do documento principal. Cada documento indexado contém apenas campos que fazem parte do elemento de array do documento incorporado. Você pode usar somente o operador embeddedDocument para campos de query indexados como tipo embeddedDocuments
.
Observação
Use o tipo embeddedDocuments
para indexar campos dentro de uma array de documentos para que você possa fazer query de cada documento aninhado individualmente. Se você só precisar fazer query de documentos aninhados em relação ao documento principal, use o tipo Como indexar campos em objetos e documentos.
O Atlas Search não indexa dinamicamente campos de índice do tipo embeddedDocument
. Você deve utilizar mapeamentos estáticos para indexar campos do embeddedDocument
. Você pode usar o Visual Editor ou o JSON Editor na UI do Atlas para indexar campos do tipo embeddedDocument
.
embeddedDocuments
Revisar Limitações de Tipo
Antes de criar um índice que use o tipo embeddedDocuments
, revise o limite de objetos de índice de 2.100.000.000 e outras limitações do Atlas Search.
Limite de 2.100.000.000 objetos de índice
O Atlas Search para de replicar alterações para índices maiores que 2.100.000.000 objetos de índice, em um conjunto de réplicas ou único fragmento, em que cada documento incorporado indexado conta como um único objeto. O uso do tipo de campo embeddedDocuments
pode resultar na indexação de objetos acima desse limite, o que faz com que um índice passe para um estado consultável Stale
e pode resultar em resultados obsoletos.
O número exato de objetos de índice pode variar com base na taxa de alterações e exclusões de documentos. A métrica Pesquisar número máximo de Lucene Docs fornece o limite superior do número atual de objetos de índice em todos os índices por conjunto de réplicas ou fragmento. Você pode aproximar o número esperado de objetos de índice em um único índice fazendo o seguinte:
Calcule o número de objetos de índice por documento. Para cada nível de aninhamento, cada documento incorporado conta como um objeto de índice separado.
total number of index objects = 1 + number of nested embedded documents Multiplique o número de objetos de índice por documento pelo número total de documentos na coleção
total number of index objects x total number of documents in collection
Observe que essa aproximação é um limite inferior.
Exemplo
Considere a coleção chamada schools
, descrita neste tutorial, e suponha que a coleção contenha 1000 documentos semelhantes aos seguintes:
{ "_id": 0, "name": "Springfield High", "mascot": "Pumas", "teachers": [ { "first": "Jane", "last": "Smith", "classes": [ { "subject": "art of science", "grade": "12th" }, ... // 2 more embedded documents ] }, ... // 1 more embedded document ], "clubs": { "stem": [ { "club_name": "chess", "description": "provides students opportunity to play the board game of chess informally and competitively in tournaments." }, ... // 1 more embedded document ], ... // 1 more embedded document } }
Agora, considere a definição do índice para os seguintes campos na coleção schools
:
A array de documentos denominados teachers
é indexada como o tipo embeddedDocuments
com mapeamentos dinâmicos habilitados. No entanto, o campo classes
não é indexado. Use o seguinte para calcular os objetos de índice:
Calcula o número de objetos de índice por documento.
Number of ``teachers`` embedded documents = up to 2 Total number of index objects per document = 1 + 2 = 3 Multiplique pelo número total de documentos na coleção.
Number of documents in the collection = 1000 Number of index objects per document = 3 Total number of index objects for collection = 1000 x 3 = 3000
As arrays de documentos denominadas teachers
e teachers.classes
são indexadas como o tipo embeddedDocuments
com mapeamentos dinâmicos habilitados. Use o seguinte para calcular os objetos de índice:
Calcule o número de objetos de índice por documento:
Number of documents = 1 Number of ``teachers`` embedded documents = up to 2 Number of ``classes`` embedded documents = up to 3 Number of index objects per document = 1 + ( 2 x 3 ) = 7 Multiplique pelo número total de documentos na coleção.
Number of documents in the collection = 1000 Number of index objects per document = 7 Total number of index objects: 1000 x 7 = 7000
Se sua coleção tiver grandes arrays que possam gerar 2.100.000.000 objetos de índice, você deve fragmentar todos os clusters que contenham índices com o tipo embeddedDocuments
.
limitações do atlas search
Aplicam-se as seguintes limitações:
Você pode utilizar o
embeddedDocuments
somente em campos com até5
níveis de aninhamento. Um campoembeddedDocuments
não pode ter mais de4
camposembeddedDocuments
pai.Não é possível usar
embeddedDocuments
para uma facet de data ou número.Você não pode definir um campo dentro do tipo
embeddedDocuments
como o tipo obsoleto KNNVector.Você não pode indexar filhos de campos indexados com tipo
embeddedDocuments
igual a token.Para destacar campos em documentos incorporados, você também deve indexar o principal do campo que deseja destacar como o tipo de documento.
Você pode fazer o seguinte somente se indexar os pais do campo filho do documento incorporado como o tipo de documento:
Busca facetada em campos de string dentro de documentos incorporados. Você também deve indexar o campo que deseja facetar como o tipo stringFacet .
Observação
Quando facetas são utilizadas em um campo de string dentro de documentos incorporados, o Atlas Search retorna a contagem de facetas somente para o número de documentos principais correspondentes.
Não é possível facetar campos numéricos e de data em documentos incorporados.
Destaque campos em documentos incorporados. Para ver um exemplo, consulte o tutorial Como executar consultas de pesquisa do Atlas contra objetos em arrayes.
Classificar pelo item principal do campo do documento incorporado. Você também deve indexar o campo do documento incorporado com valores de string como o tipo de token. Para campos secundários com valores numéricos e de data, habilite o mapeamento dinâmico para indexar esses campos automaticamente. Para ver um exemplo, consulte Exemplo de classificação.
Definir o índice para o tipo <a class=\" \" href=\"embeddedDocument
\" title=\" \"><svg xmlns=\" \" width=\" \" height=\" \" fill=\" \" viewbox=\" \" class=\" \" role=\" \" aria-label=\" \"><path fill=\" \" d=\" \"> <path fill=\" \" d=\" \">
Para definir o índice para o tipo embeddedDocument
, escolha seu método de configuração preferido na UI do Atlas e então selecione o banco de dados e collection.
Clique em Refine Your Index para configurar seu índice.
Na seção Field Mappings, clique em Add Field para abrir a janela Add Field Mapping.
Clique em Customized Configuration.
Selecione o campo a ser indexado no menu suspenso Field Name.
Observação
Você não pode indexar campos que contêm o sinal de dólar (
$
) no início do nome do campo.Clique no menu suspenso Data Type e selecione EmbeddedDocument.
Alterne a configuração de Enable Dynamic Mapping para habilitar ou desabilitar a indexação dinâmica de todos os campos indexáveis dinamicamente no documento. Para saber mais, consulte Como configurar as propriedades do campo
document
.Clique em Add.
Se você desativou o mapeamento dinâmico, clique em Add Embedded Field para o campo de tipo EmbeddedDocument para definir mapeamentos de campo para os campos do documento.
A seguir está a sintaxeJSON para o tipo embeddedDocument
. Substitua a definição de índice padrão pelo seguinte. Para saber mais sobre os campos, consulte Propriedades do campo.
1 { 2 "mappings": { 3 "dynamic": true|false, 4 "fields": { 5 "<field-name>": { 6 "type": "embeddedDocuments", 7 "dynamic": true|false, 8 "fields": { 9 "<field-name>": { 10 <field-mapping-definition> 11 } 12 } 13 } 14 } 15 } 16 }
Configurar embeddedDocument
propriedades do campo
O tipo embeddedDocuments
do Atlas Search usa os seguintes parâmetros:
Campo | Tipo | necessidade | Descrição | Default |
---|---|---|---|---|
type | string | Obrigatório | Etiqueta legível por humanos que identifica o tipo de campo. O valor deve ser embeddedDocuments . | |
dynamic | booleano | Opcional | Sinalizador que especifica se deve indexar todo campo dinamicamente indexável no documento. O valor pode ser um dos seguintes:
| false |
fields | documento | Opcional | Campos para indexar. Se Se O Atlas Search não aceita indexação de campos facet como parte de um campo | {} |
Experimente um exemplo para o embeddedDocument
tipo de
O exemplo de definição de índice abaixo utiliza a coleção sample_supplies.sales . Se você já tiver os dados de amostra carregados em seu cluster, poderá usar o Visual Editor ou o Editor JSON na UI do Atlas para configurar o índice. Após selecionar seu método de configuração preferido, selecione o banco de dados e a coleção e filtre seu índice para adicionar mapeamentos de campo.
A seguinte definição de índice indexa a array de objetos no campo items
. Ele também configura o Atlas Search para indexar automaticamente todos os campos indexáveis dinamicamente dentro dos objetos na array items
.
Na janela Add Field Mapping, selecione items no menu suspenso Field Name.
Clique no menu suspenso Data Type e selecione EmbeddedDocuments.
Alterne o Enable Dynamic Mapping para habilitar o mapeamento dinâmico, se necessário.
Clique em Add.
Substitua a definição de índice padrão pela seguinte definição de índice.
1 { 2 "mappings": { 3 "fields": { 4 "items": { 5 "type": "embeddedDocuments", 6 "dynamic": true 7 } 8 } 9 } 10 }
Observação
Para indexar todos os campos em um documento embutido incluindo campos que o Atlas Search não indexa dinamicamente, defina os campos na definição de índice. Para faceting de string, o Atlas Search conta facets de string uma vez para cada documento no conjunto de resultados.
Por exemplo, a definição de índice a seguir configura o Atlas Search para indexar automaticamente todos os campos indexáveis dinamicamente dentro dos objetos na array items
. Ele também configura o campo purchaseMethod
dentro da array de objetos para ser indexado como stringFacet, que o Atlas Search não indexa dinamicamente, para suportar as queries de facet do Atlas Search nesse campo:
Clique em Add Field na seção Field Mappings e adicione os seguintes campos clicando em Add após configurar as configurações para cada campo na janela Add Field Mapping.
Field Name | Data Type |
---|---|
items | Clique no menu suspenso e selecione EmbeddedDocuments . |
purchaseMethod | Clique no menu suspenso e selecione StringFacet . |
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { 5 "items": { 6 "dynamic": true, 7 "type": "embeddedDocuments" 8 }, 9 "purchaseMethod": { 10 "type": "stringFacet" 11 } 12 } 13 } 14 }
A definição de índice a seguir configura o Atlas Search para indexar somente os campos name
e tags
como o tipo de Atlas Search string
na array de objetos items
.
Na janela Add Field Mapping, selecione items no menu suspenso Field Name.
Clique no menu suspenso Data Type e selecione EmbeddedDocuments.
Desative o Enable Dynamic Mapping.
Clique em Add.
Clique em Add Embedded Field para o campo items na tabela Field Mappings e adicione os seguintes campos clicando em Add após definir as configurações de cada campo na janela Add Embedded Field Mapping .
Field NameData Typeitems.nameClique no menu suspenso Data Type e selecione String.items.tagsClique no menu suspenso Data Type e selecione String.
Substitua a definição de índice padrão pela seguinte definição de índice.
1 { 2 "mappings": { 3 "fields": { 4 "items": { 5 "type": "embeddedDocuments", 6 "dynamic": false, 7 "fields": { 8 "name": { 9 "type": "string" 10 }, 11 "tags": { 12 "type": "string" 13 } 14 } 15 } 16 } 17 } 18 }