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

Como indexar campos em arrays de objetos e documentos

Nesta página

  • Revise as limitações de tipo embeddedDocuments
  • Limite de 2.100.000.000 objetos de índice
  • limitações do atlas search
  • Defina o índice para o tipo embeddedDocument
  • Configurar propriedades do campo embeddedDocument
  • Experimente um exemplo para o tipo de embeddedDocument

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.

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.

O Atlas Search para de replicar alterações para índices maiores que 2,100,000,000 objetos de índice por partição, em um conjunto de réplicas ou fragmento único, onde cada documento incorporado indexado conta como um único objeto. Usar o embeddedDocuments tipo de campo pode resultar na indexação de objetos acima desse limite, o que faz com que um Stale índice faça a transição para um estado de query e pode resultar em resultados obsoletos. Se você criar um índice do Atlas Search para uma coleção que tem ou terá em breve mais de 2.1 bilhões de objetos de índice, deverá usar a numPartitions opção ou fragmentar o cluster.

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:

  1. 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
  2. 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:

  1. 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
  2. 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:

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

Aplicam-se as seguintes limitações:

  • Você pode utilizar o embeddedDocuments somente em campos com até 5 níveis de aninhamento. Um campo embeddedDocuments não pode ter mais de 4 campos embeddedDocuments 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.

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

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.

  1. Clique em Refine Your Index para configurar seu índice.

  2. Na seção Field Mappings, clique em Add Field para abrir a janela Add Field Mapping.

  3. Clique em Customized Configuration.

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

  5. Clique no menu suspenso Data Type e selecione EmbeddedDocument.

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

  7. Clique em Add.

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

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:

  • true - indexar todos os campos indexáveis.

  • false - não indexe todos os campos indexáveis.

false

fields

documento

Opcional

Campos para indexar.

Se dynamic for true, o Atlas Search indexa todos os campos indexáveis.

Se dynamic for false, você pode especificar os campos a serem indexados na definição de campo para fields.

O Atlas Search não aceita indexação de campos facet como parte de um campo embeddedDocuments.

{}

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.

  1. Na janela Add Field Mapping, selecione items no menu suspenso Field Name.

  2. Clique no menu suspenso Data Type e selecione EmbeddedDocuments.

  3. Alterne o Enable Dynamic Mapping para habilitar o mapeamento dinâmico, se necessário.

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

  1. Na janela Add Field Mapping, selecione items no menu suspenso Field Name.

  2. Clique no menu suspenso Data Type e selecione EmbeddedDocuments.

  3. Desative o Enable Dynamic Mapping.

  4. Clique em Add.

  5. 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 Name
    Data Type

    items.name

    Clique no menu suspenso Data Type e selecione String.

    items.tags

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

Dica

Consulte também: Exemplos adicionais de definição de índice

Voltar

documento