Compartilhar via


Gerenciar a indexação de vCore no Azure Cosmos DB for MongoDB

APLICA-SE AO: MongoDB vCore

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

Importante

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

Tipos de índice

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

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

Este aplicativo de exemplo armazena artigos como documentos com a seguinte estrutura. Todo o exemplo citado utiliza ainda mais a estrutura dessa 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

Í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. O campo _id permanece indexado por padrão.

O vCore do Azure Cosmos DB for MongoDB dá suporte à criação de índice no seguinte

  • Campos de documento de nível superior.
  • Documento inserido.
  • Campos no documento inserido.

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

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.

Observação

O vCore do Azure Cosmos DB for MongoDB permite a criação de no máximo 64 índices em uma coleção. Dependendo da camada, podemos planejar a extensão para até 300 índices mediante solicitação.

Índice composto

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

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

use cosmicworks

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

A Order de campos afeta a seletividade ou a utilização do índice. A consulta find 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 em 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

  • Índices parciais não dão suporte ao ORDER BY ou UNIQUE, a menos que o filtro se qualifique.

Índices de texto

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

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

use cosmicworks;

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

Observação

Embora seja possível definir apenas um índice de texto por coleção, o vCore do Azure Cosmos DB for MongoDB permite criar índices de texto junto a vários campos para realizar pesquisas de texto em diferentes campos dos seus documentos.

Configurar opções de índice de texto

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

  • Crie um índice para dar suporte à pesquisa nos campos title e content, com suporte à língua inglesa. Além disso, atribua pesos mais altos ao campo title 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 }
    )
    

Observação

Quando um cliente realiza uma consulta de pesquisa de texto com o termo "Cosmos DB", a pontuação de cada documento na coleção é 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 peso mais alto.

Realizar uma pesquisa de texto usando um índice de texto

Após o índice de texto ter sido criado, você poderá executar pesquisas de texto usando o operador "text" nas suas consultas. O operador de texto usa uma cadeia de caracteres de pesquisa e a equipara ao índice de texto para localizar documentos relevantes.

  • Faça uma pesquisa de texto pela frase Cosmos DB.

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

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

Limitações

  • Somente um índice de texto pode ser configurado em uma coleção.
  • Os índices de texto dão suporte a pesquisas de texto simples e ainda não fornecem recursos de pesquisa avançados, como a de expressões regulares.
  • As operações de classificação não podem usar a ordem do índice de texto no MongoDB.
  • Hint() não é compatível com consultas que usam a expressão $text.
  • Os índices de texto podem ser relativamente grandes, consumindo um 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 documento de exemplo a seguir

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

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

Limitações

  • Índices curinga não dão suporte a índices exclusivos.
  • Índices curinga não dão suporte a pushdowns de ORDER BY, a 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

Índices geoespaciais dão suporte a consultas em dados armazenados como objetos GeoJSON ou pares de coordenadas herdados. Você pode usar índices geoespaciais para melhorar o desempenho de consultas em dados geoespaciais ou para executar determinadas consultas geoespaciais.

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

  • Índices 2dsphere, que dão suporte a consultas que interpretam geometria em uma esfera.
  • Índices 2D, que dão suporte a consultas que interpretam geometria em uma superfície plana.

Índices 2D

Há suporte para os índices 2D apenas no estilo de par de coordenadas herdado de armazenar dados geoespaciais.

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

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

Limitações

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

Índices 2dsphere

Os índices 2dsphere dão suporte a consultas geoespaciais em uma esfera semelhante à Terra. Eles podem dar suporte a objetos GeoJSON ou a pares de coordenadas herdados. Os índices 2dSphere funcionam com o estilo GeoJSON de armazenamento de dados, se pontos herdados forem encontrados, eles serão convertidos em pontos GeoJSON.

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

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

Os índices 2dsphere permitem a criação de í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

  • Não há suporte para um índice composto usando um índice regular e um índice geoespacial. A criação de 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 buracos não funcionam. A inserção de um polígono com o buraco não é restrita, embora a consulta $geoWithin falhe em cenários:

    1. Em que a consulta em si tiver polígono com buracos.

      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. Em que há algum documento não filtrado que tem polígono com buracos.

      [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. O campo key é obrigatório ao usar geoNear.

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

Próximas etapas