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 firstName
incorporado.
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
ouUNIQUE
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 aotitle
idioma inglês. Além disso, atribua pesos mais altos aotitle
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 otextScore
campo em uma consulta para ver o pesouse 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 eone
/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 do2d
índice e apenasone
outro campo não geoespacial pode fazer parte docompound 2d
índicedb.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: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
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
key
campo obrigatório durante a utilizaçãogeoNear
do .[mongos] test> coll.aggregate([{ $geoNear: { $near: { "type": "Point", coordinates: [0, 0] } } }]) // MongoServerError: $geoNear requires a 'key' option as a String
Próximos passos
- Saiba mais sobre indexação Práticas recomendadas para resultados mais eficientes.
- Saiba mais sobre a indexação em segundo plano
- Aprenda aqui a trabalhar com indexação de texto.
- Saiba aqui sobre a indexação de curingas.