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
ouUNIQUE
, 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
econtent
, com suporte à língua inglesa. Além disso, atribua pesos mais altos ao campotitle
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 campotextScore
em uma consulta para exibir o pesouse 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 eone
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 índice2d
e apenasone
outro campo não geoespacial pode fazer parte do índicecompound 2d
dedb.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: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
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
O campo
key
é obrigatório ao usargeoNear
.[mongos] test> coll.aggregate([{ $geoNear: { $near: { "type": "Point", coordinates: [0, 0] } } }]) // MongoServerError: $geoNear requires a 'key' option as a String
Próximas etapas
- Saiba mais sobre Práticas recomendadas de indexação para resultados mais eficientes.
- Saiba mais sobre indexação em segundo plano
- Saiba aqui como trabalhar com Indexação de texto.
- Saiba mais aqui sobre a Indexação curinga.