Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Índice parcial
Un índice parcial indexa los documentos de una colección que cumplen un criterio de filtro especificado. La función de indexación parcial es compatible con los clústeres basados en instancias de Amazon DocumentDB 5.0.
Temas
Cree un índice parcial
Para crear un índice parcial, utilice el createIndex()
método con la partialFilterExpression
opción. Por ejemplo, la siguiente operación crea un índice compuesto único en la colección de pedidos que indexa los documentos que tienen un campo OrderID
y cuyo isDelivered
campo es verdadero:
db.orders.createIndex( {"category": 1, "CustomerId": 1, "OrderId": 1}, {"unique": true, "partialFilterExpression": {"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]} } )
Operadores admitidos
$eq
$exists
$and (solo en el nivel superior)
$gt/$gte/$lt/$lte (el escaneo de índices solo se usa cuando el filtro, basado en la consulta, coincide exactamente con la expresión del filtro parcial) (consulte las limitaciones)
Consulta mediante un índice parcial
Los siguientes patrones de consulta son posibles con índices parciales:
-
El predicado de la consulta coincide exactamente con la expresión del filtro de índice parcial:
db.orders.find({"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]}).explain()
-
El resultado esperado del filtro de consulta es un subconjunto lógico del filtro parcial:
db.orders.find({"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}}, {"OrderAmount": {"$eq": "5"}} ]}).explain()
-
Se puede usar un subpredicado de la consulta junto con otros índices:
db.orders.createIndex({"anotherIndex":1}) db.orders.find({ "$or": [ {"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]}, {"anotherIndex": {"$eq": 5}} ] }).explain()
nota
Un planificador de consultas puede optar por utilizar un escaneo de colecciones en lugar de un escaneo de índices si es eficiente hacerlo. Esto suele ocurrir en el caso de colecciones o consultas muy pequeñas que devuelven una gran parte de una colección.
Funcionalidades de indexación parcial
Enumere los índices parciales
Enumere los índices parciales partialFilterExpression mediante la getIndex
operación. Por ejemplo, la getIndex
operación que se ejecuta en muestra índices parciales con los campos clave, nombre y PartialFilterExpressions:
db.orders.getIndexes()
En este ejemplo se devuelve el siguiente resultado:
[
{
"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}}
]
}
}
]
Expresión de filtro parcial múltiple en la misma clave: orden
Se pueden crear diferentes índices parciales para las mismas combinaciones de campos (clave:orden). Estos índices deben tener un nombre diferente.
db.orders.createIndex( {"OrderId":1}, { name:"firstPartialIndex", partialFilterExpression:{"OrderId":{"$exists": true}} } )
db.orders.createIndex( {"OrderId":1}, { name:"secondPartialIndex", partialFilterExpression:{"OrderId":{"$gt": 1000}} } )
Ejecute getIndexes
la operación para enumerar todos los índices de la colección:
db.orders.getIndexes()
Estos ejemplos devuelven el siguiente resultado:
[
{
"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
Los nombres de los índices deben ser diferentes y se deben eliminar únicamente por su nombre.
Índices con propiedades parciales y TTL
También puede crear índices con propiedades parciales y TTL especificando ambas partialFilterExpression
expireAfterSeconds
opciones durante la creación del índice. Esto le permite tener más control sobre qué documentos se eliminan ahora de una colección.
Por ejemplo, puede tener un índice TTL que identifique los documentos que se van a eliminar después de un período de tiempo determinado. Ahora puede establecer condiciones adicionales sobre cuándo eliminar documentos mediante la opción de indexación parcial:
db.orders.createIndex( { "OrderTimestamp": 1 }, { expireAfterSeconds: 3600 , partialFilterExpression: { "isDelivered": { $eq: true } } } )
Este ejemplo devuelve el siguiente resultado:
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1,
"operationTime" : Timestamp(1234567890, 1)
}
Ejecute la getIndexes
operación para enumerar los índices presentes en la colección:
db.orders.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.orders" }
Este ejemplo devuelve el siguiente resultado:
[
{
"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
}
]
Limitaciones parciales del índice
La función de indexación parcial tiene las siguientes limitaciones:
-
Las consultas de desigualdad en Amazon DocumentDB solo utilizarán un índice parcial cuando el predicado del filtro de consultas coincida exactamente con el mismo tipo de datos
partialFilterExpression
y sea del mismo tipo de datos.nota
Ni siquiera
$hint
se puede usar para forzar el IXSCAN en el caso anterior.En el siguiente ejemplo, el solo
partialFilterExpression
se aplica a,field1
pero nofield2
: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
-
No se admiten los operadores A
partialFilterExpression
con matriz. La siguiente operación generará un error:db.orders.createIndex( {"CustomerId":1}, {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}} )
Los siguientes operadores no se admiten en el partialFilterExpression campo:
$all
(operador de matriz)$mod
(operador de matriz)$or
$xor
$not
$nor
El tipo de datos de la expresión de filtro y el filtro deben ser iguales.