Partilhar via


Gerenciar indexação no Azure Cosmos DB para MongoDB vCore

APLICA-SE A: MongoDB vCore

Os índices são estruturas que melhoram a velocidade de recuperação de dados, fornecendo acesso rápido aos campos de uma coleção. Eles funcionam criando um conjunto ordenado de ponteiros para dados, geralmente com base em campos-chave. O Azure Cosmos DB para MongoDB vCore utiliza índices em vários contextos, incluindo push down de consulta, restrições exclusivas e fragmentação.

Importante

O campo "_id" é o único campo indexado por padrão & o tamanho máximo do campo pode ser 2 KB. Recomenda-se adicionar índices adicionais com base em filtros de consulta e predicados para otimizar o desempenho.

Tipos de índice

Para simplificar, vamos considerar um exemplo de um aplicativo de blog com a seguinte configuração:

  • Nome do banco de dados: cosmicworks
  • Nome da coleção: products

Este aplicativo de exemplo armazena artigos como documentos com a seguinte estrutura. Todos os exemplos citados utilizam ainda a estrutura desta coleção.

{
  "_id": ObjectId("617a34e7a867530bff1b2346"),
  "title": "Azure Cosmos DB - A Game Changer",
  "content": "Azure Cosmos DB is a globally distributed, multi-model database service.",
  "author": {lastName: "Doe", firstName: "John"},
  "category": "Technology",
  "launchDate": ISODate("2024-06-24T10:08:20.000Z"),
  "published": true
}

Índices de campo único

Os índices de campo único armazenam informações de um único campo em uma coleção. A ordem de classificação do índice de campo único não importa. _id permanece indexado por padrão.

O Azure Cosmos DB para MongoDB vCore suporta a criação de índice no seguinte

  • Campos de documento de nível superior.
  • Documento incorporado.
  • Campos dentro do documento incorporado.

O comando a seguir cria um único índice de campo no campo author e o comando a seguir o cria em um campo firstNameincorporado.

use cosmicworks

db.products.createIndex({"author": 1})

// indexing embedded property
db.products.createIndex({"author.firstName": -1})

Uma consulta pode usar vários índices de campo único, quando disponíveis.

Nota

O Azure Cosmos DB para MongoDB vCore permite criar um máximo de 64 índices em uma coleção. Dependendo do nível, podemos planejar extensões de até 300 índices, mediante solicitação.

Índices compostos

Os índices compostos melhoram o desempenho do banco de dados, permitindo consultas e classificações eficientes com base em vários campos dentro dos documentos. Essa otimização reduz a necessidade de digitalizar coleções inteiras, acelerando a recuperação e a organização dos dados.

O comando a seguir cria um índice composto nos campos author e launchDate na ordem de classificação oposta.

use cosmicworks

db.products.createIndex({"author":1, "launchDate":-1})

Order dos campos afetam a seletividade ou utilização do índice. A find consulta não utilizaria o índice criado.

use cosmicworks

db.products.find({"launchDate": {$gt: ISODate("2024-06-01T00:00:00.000Z")}})

Limitações

  • Máximo de 32 campos\caminhos dentro de um índice composto.

Índices parciais

Índices que têm um filtro de consulta associado que descreve quando gerar um termo no índice.

use cosmicworks

db.products.createIndex (
   { "author": 1, "launchDate": 1 },
   { partialFilterExpression: { "launchDate": { $gt: ISODate("2024-06-24T10:08:20.000Z") } } }
)

Limitações

  • Os índices parciais não suportam ORDER BY ou UNIQUE a menos que o filtro se qualifique.

Índices de texto

Os índices de texto são estruturas de dados especiais que otimizam consultas baseadas em texto, tornando-as mais rápidas e eficientes.

Use o createIndex método com a text opção para criar um índice de texto no title campo.

use cosmicworks;

db.products.createIndex({ title: "text" })

Nota

Embora você possa definir apenas um índice de texto por coleção, o Azure Cosmos DB para MongoDB vCore permite criar índices de texto na combinação de vários campos para permitir que você realize pesquisas de texto em campos diferentes em seus documentos.

Configurar opções de índice de texto

Os índices de texto no Azure Cosmos DB para MongoDB vCore vêm com várias opções para personalizar seu comportamento. Por exemplo, você pode especificar o idioma para análise de texto, definir pesos para priorizar determinados campos e configurar pesquisas que não diferenciam maiúsculas de minúsculas. Aqui está um exemplo de criação de um índice de texto com opções:

  • Crie um índice para suportar a pesquisa nos campos e content com suporte ao title idioma inglês. Além disso, atribua pesos mais altos ao title campo para priorizá-lo nos resultados da pesquisa.

    use cosmicworks
    
    db.products.createIndex(
        { title: "text", content: "text" },
        { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
    )
    

Nota

Quando um cliente realiza uma consulta de pesquisa de texto com o termo "Cosmos DB", a pontuação para cada documento da coleção será calculada com base na presença e frequência do termo nos campos "título" e "conteúdo", com maior importância dada ao campo "título" devido ao seu maior peso.

Executar uma pesquisa de texto usando um índice de texto

Uma vez que o índice de texto é criado, você pode realizar pesquisas de texto usando o operador "texto" em suas consultas. O operador de texto usa uma cadeia de caracteres de pesquisa e a faz a correspondência com o índice de texto para localizar documentos relevantes.

  • Realize uma pesquisa de texto para a frase Cosmos DB.

    use cosmicworks
    
    db.products.find(
      { $text: { $search: "Cosmos DB" } }
    )
    
  • Opcionalmente, use o $meta operador de projeção junto com o textScore campo em uma consulta para ver o peso

    use cosmicworks
    
    db.products.find(
    { $text: { $search: "Cosmos DB" } },
    { score: { $meta: "textScore" } }
    )
    

Limitações

  • Apenas um índice de texto pode ser definido em uma coleção.
  • Os índices de texto suportam pesquisas de texto simples e ainda não fornecem recursos avançados de pesquisa, como expressões regulares.
  • As operações de classificação não podem usar a ordenação do índice de texto no MongoDB.
  • Não há suporte para Hint() em combinação com uma consulta usando $text expressão.
  • Os índices de texto podem ser relativamente grandes, consumindo espaço de armazenamento significativo em comparação com outros tipos de índice.

Índices curinga

Índice em um único campo, indexa todos os caminhos abaixo do field , excluindo outros campos que estão no mesmo nível. Por exemplo, para o seguinte documento de exemplo

{
 "children":
    {
     "familyName": "Merriam",
     "pets": { "details": {“name”: "Goofy", ”age”: 3} }
   } 
}

Criar um índice em { "pets.$**": 1 }, cria índice em detalhes e propriedades de subdocumentos, mas não cria um índice em "familyName".

Limitações

  • Os índices curinga não podem oferecer suporte a índices exclusivos.
  • Os índices curinga não suportam pushdowns, a ORDER BY menos que o filtro inclua apenas caminhos presentes no curinga (já que eles não indexam elementos indefinidos)
  • Um índice curinga composto só pode ter one termo curinga e one /ou mais termos de índice. { "pets.$**": 1, “familyName”: 1 }

Índices geoespaciais

Os índices geoespaciais suportam consultas em dados armazenados como objetos GeoJSON ou pares de coordenadas herdadas. Você pode usar índices geoespaciais para melhorar o desempenho de consultas sobre dados geoespaciais ou para executar determinadas consultas geoespaciais.

O Azure Cosmos DB para MongoDB vCore fornece dois tipos de índices geoespaciais:

  • 2dsphere Indexes, que suportam consultas que interpretam a geometria em uma esfera.
  • Índices 2d, que suportam consultas que interpretam a geometria em uma superfície plana.

Índices 2d

Os índices 2D são suportados apenas com o estilo de par de coordenadas legado de armazenamento de dados geoespaciais.

Use o createIndex método com a 2d opção para criar um índice geoespacial no location campo.

db.places.createIndex({ "location": "2d"});

Limitações

  • Apenas one o campo de localização pode fazer parte do 2d índice e apenas one outro campo não geoespacial pode fazer parte do compound 2d índice db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })

Índices 2dsphere

2dsphere Os índices suportam consultas geoespaciais em uma esfera semelhante à Terra. Ele pode suportar objetos GeoJSON ou pares de coordenadas herdadas. 2dSphere os índices funcionam com o estilo GeoJSON de armazenamento de dados, se pontos herdados forem encontrados, ele será convertido em ponto GeoJSON.

Use o createIndex método com a 2dsphere opção para criar um índice geoespacial no location campo.

db.places.createIndex({ "location": "2dsphere"});

2dsphere Os índices permitem criar índices em vários campos de dados geoespaciais e não geoespaciais. db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })

Limitações

  • Um índice composto usando um índice regular e um índice geoespacial não é suportado. Criar qualquer um dos índices geoespaciais levaria a erros.

    // Compound Regular & 2dsphere indexes are not supported yet
    db.collection.createIndex({a: 1, b: "2dsphere"})
    
    // Compound 2d indexes are not supported yet
    db.collection.createIndex({a: "2d", b: 1})
    
  • Polígonos com furos não funcionam. A inserção de um Polígono com furo não é restrita, embora $geoWithin a consulta falhe em cenários:

    1. Se a consulta em si tiver polígono com furos

      coll.find(
        {
            "b": {
                "$geoWithin": {
                    "$geometry": {
                        "coordinates": [
                            [
                                [ 0, 0], [0, 10], [10, 10],[10,0],[0, 0]
                            ],
                            [
                                [5, 5], [8, 5], [ 8, 8], [ 5, 8], [ 5, 5]
                            ]
                        ],
                        "type": "Polygon"
                    }
                }
            }
        })
      
      // MongoServerError: $geoWithin currently doesn't support polygons with holes
      
    2. Se houver algum documento não filtrado que tenha polígono com orifícios.

      [mongos] test> coll.find()
        [
          {
            _id: ObjectId("667bf7560b4f1a5a5d71effa"),
            b: {
              type: 'Polygon',
              coordinates: [
                [ [ 0, 0 ], [ 0, 10 ], [ 10, 10 ], [ 10, 0 ], [ 0, 0 ] ],
                [ [ 5, 5 ], [ 8, 5 ], [ 8, 8 ], [ 5, 8 ], [ 5, 5 ] ]
              ]
            }
          }
        ]
      // MongoServerError: $geoWithin currently doesn't support polygons with holes
      
    3. key campo obrigatório durante a utilização geoNeardo .

       [mongos] test> coll.aggregate([{ $geoNear: { $near: { "type": "Point", coordinates: [0, 0] } } }])
      
       // MongoServerError: $geoNear requires a 'key' option as a String
      

Próximos passos