Índice parcial - Amazon DocumentDB

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.

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.