As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Um índice parcial indexa documentos em uma coleção que atende a um critério de filtro especificado. O recurso parcial de índice é aceito em clusters baseados em instância do Amazon DocumentDB 5.0.
Tópicos
Crie um índice parcial
Para criar um índice parcial, use o método createIndex()
com a opção partialFilterExpression
. Por exemplo, a operação a seguir cria um índice composto exclusivo na coleção de pedidos que indexa documentos com um OrderID
e com o campo isDelivered
verdadeiro:
db.orders.createIndex( {"category": 1, "CustomerId": 1, "OrderId": 1}, {"unique": true, "partialFilterExpression": {"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]} } )
Operadores compatíveis
$eq
$exists
$and (somente no nível superior)
$gt/$gte/$lt/$lte (a varredura de índice só é usada quando o filtro, predicado na consulta, corresponde exatamente à expressão do filtro parcial) (consulte Limitações)
Consultar usando um índice parcial
Os seguintes padrões de consulta são possíveis usando índices parciais:
-
O predicado da consulta corresponde exatamente à expressão do filtro de índice parcial:
db.orders.find({"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]}).explain()
-
O resultado esperado do filtro de consulta é um subconjunto lógico do filtro parcial:
db.orders.find({"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}}, {"OrderAmount": {"$eq": "5"}} ]}).explain()
-
Um subpredicado da consulta pode ser usado em conjunto com outros índices:
db.orders.createIndex({"anotherIndex":1}) db.orders.find({ "$or": [ {"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]}, {"anotherIndex": {"$eq": 5}} ] }).explain()
nota
Um planejador de consultas pode optar por usar uma varredura de coleção em vez de uma varredura de índice, se for eficiente fazer isso. Isso geralmente é visto em coleções ou consultas muito pequenas que retornariam uma grande parte de uma coleção.
Funcionalidades parciais de índice
Listar índices parciais
Liste índices parciais partialFilterExpression usando a getIndex
operação. Por exemplo, a operação getIndex
emitida lista índices parciais com os campos key, name e partialFilterExpressions:
db.orders.getIndexes()
Este exemplo retorna a saída a seguir:
[
{
"v" : 4,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "ecommerceApp.orders"
},
{
"v" : 4,
"unique" : true,
"key" : {
"category" : 1,
"" : 1,
"CustomerId" : 1,
"OrderId" : 1
},
"name" : "category_1_CustID_1_OrderId_1",
"ns" : "ecommerceApp.orders",
"partialFilterExpression" : {
"$and" : [
{"OrderId": {"$exists": true}},
{"isDelivered": {"$eq": false}}
]
}
}
]
Expressão múltipla de filtro parcial na mesma chave:ordem
Diferentes índices parciais podem ser criados para as mesmas combinações de campos (chave:ordem). Esses índices devem ter nomes diferentes.
db.orders.createIndex( {"OrderId":1}, { name:"firstPartialIndex", partialFilterExpression:{"OrderId":{"$exists": true}} } )
db.orders.createIndex( {"OrderId":1}, { name:"secondPartialIndex", partialFilterExpression:{"OrderId":{"$gt": 1000}} } )
Execute a operação getIndexes
para listar todos os índices na coleção:
db.orders.getIndexes()
Este exemplo retorna a saída a seguir:
[
{
"v" : 4,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "ecommerceApp.orders"
},
{
"v" : 4,
"key" : {
"OrderId" : 1
},
"name" : "firstPartialIndex",
"ns" : "ecommerceApp.orders",
"partialFilterExpression" : {"OrderId":{"$exists": true}}
},
{
"v" : 4,
"key" : {
"OrderId" : 1
},
"name" : "secondPartialIndex",
"ns" : "ecommerceApp.orders",
"partialFilterExpression" : {"OrderId":{"$gt": 1000}}
}
]
Importante
Os nomes dos índices devem ser diferentes e devem ser excluídos somente pelo nome.
Índices com propriedades parciais e TTL
Você também pode criar índices com propriedades parciais e TTL especificando as opções partialFilterExpression
e expireAfterSeconds
durante a criação do índice. Isso permite que você forneça mais controle sobre quais documentos agora são removidos de uma coleção.
Por exemplo, você pode ter um índice TTL que identifica documentos a serem excluídos após um determinado período de tempo. Agora você pode fornecer condições adicionais sobre quando excluir documentos usando a opção de índice parcial:
db.orders.createIndex( { "OrderTimestamp": 1 }, { expireAfterSeconds: 3600 , partialFilterExpression: { "isDelivered": { $eq: true } } } )
Este exemplo retorna a saída a seguir:
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1,
"operationTime" : Timestamp(1234567890, 1)
}
Execute a operação getIndexes
para listar os índices presentes na coleção:
db.orders.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.orders" }
Este exemplo retorna a saída a seguir:
[
{
"v": 4,
"key": {
"_id": 1
},
"name": "_id_",
"ns": "ecommerceApp.orders"
},
{
"v": 4,
"key": {
"OrderTimestamp": 1
},
"name": "OrderTimestamp_1",
"ns": "ecommerceApp.orders",
"partialFilterExpression": {
"isDelivered": {
"$eq": true
}
},
"expireAfterSeconds": 3600
}
]
Limitações parciais do índice
As seguintes limitações se aplicam ao recurso de índice parcial:
-
As consultas de desigualdade no Amazon DocumentDB só usarão um índice parcial quando o predicado do filtro de consulta corresponder exatamente a
partialFilterExpression
e for do mesmo tipo de dados.nota
Nem mesmo
$hint
pode ser usado para forçar o IXSCAN no caso acima.No exemplo a seguir,
partialFilterExpression
é aplicado somente afield1
, mas não afield2
:db.orders.createIndex( {"OrderAmount": 1}, {"partialFilterExpression": { OrderAmount : {"$gt" : 5}}} ) db.orders.find({OrderAmount : {"$gt" : 5}}) // Will use partial index db.orders.find({OrderAmount : {"$gt" : 6}}) // Will not use partial index db.orders.find({OrderAmount : {"$gt" : Decimal128(5.00)}}) // Will not use partial index
-
Um
partialFilterExpression
com operadores de matriz não é compatível. A operação a seguir gerará um erro:db.orders.createIndex( {"CustomerId":1}, {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}} )
Os seguintes operadores não são suportados no partialFilterExpression campo:
$all
(operador de matriz)$mod
(operador de matriz)$or
$xor
$not
$nor
O tipo de dados da expressão do filtro e do filtro deve ser o mesmo.