Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Gestionar índices

Esta página muestra cómo gestionar los índices existentes. Para obtener instrucciones sobre cómo crear índices, consulte las páginas del tipo de índice específico.

Las siguientes secciones proporcionan métodos para visualizar índices existentes en una colección o en una base de datos completa.

Para devolver una lista de todos los índices en una colección, use el db.collection.getIndexes() método o similar un método para su driver.

Por ejemplo, para ver todos los índices de la colección people, ejecuta el siguiente comando:

db.people.getIndexes()

Para enumerar todos los índices de colección en una base de datos, ejecute el siguiente comando mongosh en:

db.getCollectionNames().forEach(function(collection) {
indexes = db[collection].getIndexes();
print("Indexes for " + collection + ":");
printjson(indexes);
});

Para listar todos los índices de un cierto tipo (como encriptada o text) para todas las colecciones en toda la base de datos, ejecuta el siguiente comando en mongosh:

// The following finds all hashed indexes
db.adminCommand("listDatabases").databases.forEach(function(d){
let mdb = db.getSiblingDB(d.name);
mdb.getCollectionInfos({ type: "collection" }).forEach(function(c){
let currentCollection = mdb.getCollection(c.name);
currentCollection.getIndexes().forEach(function(idx){
let idxValues = Object.values(Object.assign({}, idx.key));
if (idxValues.includes("hashed")) {
print("Hashed index: " + idx.name + " on " + d.name + "." + c.name);
printjson(idx);
};
});
});
});

Para ver una lista de todos los índices en una colección en MongoDB Compass, haz clic en la colección objetivo en el panel izquierdo y selecciona la Indexes tab.

Ver índices en una colección en Compass

Para más detalles sobre la información mostrada en esta pestaña, consulte la documentación de Compass.

Tip

Ocultar un Índice Antes de Eliminarlo

Si descartas un índice que se utiliza activamente en producción, es posible que tu aplicación sufra una degradación del rendimiento. Antes de descartar un índice, puede evaluar el impacto potencial del descarte ocultando el índice.

Los índices ocultos no se utilizan para respaldar consultas. Si ocultas un índice y notas un impacto negativo sustancial en el rendimiento, considera conservar y mostrar el índice para que las consultas puedan reanudar su uso.

Para **aprender** cómo **remover** un índice existente, consulte **Descartar** un **índice**.

Para aprender cómo remover un índice en MongoDB Compass, consulte Administrar índices en Compass.

Para modificar un índice existente en el MongoDB Shell, necesitas descartar y volver a crear el índice. La excepción a esta regla son los índices TTL, que pueden modificarse mediante el comando collMod en conjunto con el distintivo de colección index.

Para modificar un índice existente en MongoDB Compass, debes descartar y recrear el índice.

Si descartas un índice que se utiliza activamente en producción, tu aplicación puede experimentar una degradación del rendimiento. Para garantizar que las consultas puedan seguir utilizando un índice durante la modificación, puedes crear un índice redundante temporal que contenga los mismos campos que el índice modificado.

Este ejemplo crea un nuevo índice y lo modifica para hacerlo único.

1

Ejecuta este comando:

db.siteAnalytics.createIndex( { "url": 1 } )

El comando devuelve el nombre del índice:

url_1
2

Ejecuta este comando:

db.siteAnalytics.createIndex( { "url": 1, "dummyField": 1 } )

El comando devuelve el nombre del índice:

url_1_dummyField_1

Este índice temporal te permite descartar con seguridad el índice original { "url": 1 } sin afectar el rendimiento.

3

Ejecuta este comando:

db.siteAnalytics.dropIndex( { "url_1" } )

El comando devuelve:

{ nIndexesWas: 3, ok: 1 }
4

Ejecuta este comando:

db.siteAnalytics.createIndex( { "url": 1 }, { "unique": true } )

El comando devuelve el nombre del índice:

url_1

El índice url_1 se recrea y puedes descartar el índice temporal sin afectar el rendimiento. Las consultas en el campo url pueden utilizar el nuevo índice único.

5

Ejecuta este comando:

db.siteAnalytics.dropIndex( { "url_1_dummyField_1" } )

El comando devuelve:

{ nIndexesWas: 3, ok: 1 }
6

Para visualizar los índices en la colección siteAnalytics, ejecute este comando:

db.siteAnalytics.getIndexes()

El comando devuelve estos índices, indicando que el índice url_1 es ahora único:

[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { url: 1 }, name: 'url_1', unique: true }
]

Una colección particionada tiene un índice inconsistente si la colección no tiene exactamente los mismos índices (incluidas las opciones de índice) en cada partición que contiene fragmentos de la colección. Aunque no deberían ocurrir índices inconsistentes durante las operaciones normales, pueden ocurrir índices inconsistentes, como por ejemplo:

  • Cuando un usuario está creando un índice con una restricción de clave unique y una partición contiene un fragmento con documentos duplicados. En tales casos, la operación de creación de índice puede tener éxito en las particiones sin duplicados, pero no en la partición con duplicados.

  • Cuando un usuario está compilando un índice en las particiones de forma continua (es decir, compilando manualmente el índice uno por uno en las particiones), pero no logra compilar el índice para una partición asociado o compila incorrectamente un índice con una especificación diferente.

Por defecto, el servidor de configuración primario verifica la falta de coherencia de los índices entre las particiones para las colecciones particionadas. El comando serverStatus, cuando se ejecuta en el primario del servidor de configuración, devuelve el campo shardedIndexConsistency para informar sobre el número de colecciones particionadas con inconsistencias en los índices.

Si shardedIndexConsistency informa de alguna inconsistencia en el índice, puedes ejecutar el comando checkMetadataConsistency con checkIndexes: true para tus colecciones particionadas y encontrar las inconsistencias.

  1. Ejecute el comando checkMetadataConsistency:

    db.runCommand( {
    checkMetadataConsistency: 1,
    checkIndexes: true
    } )
  2. Si la colección tiene índices inconsistentes, el comando checkMetadataConsistency devuelve detalles sobre los índices inconsistentes similares a los siguientes:

    {
    cursor: {
    id: Long('0'),
    ns: 'test.$cmd.aggregate',
    firstBatch: [
    {
    type: 'InconsistentIndex',
    description: 'Found an index of a sharded collection that is inconsistent between different shards',
    details: {
    namespace: 'test.reviews',
    info: {
    missingFromShards: [],
    inconsistentProperties: [
    { k: 'expireAfterSeconds', v: Long('600') },
    { k: 'expireAfterSeconds', v: 3600 }
    ],
    indexName: 'reviewDt_1'
    }
    }
    },
    {
    type: 'InconsistentIndex',
    description: 'Found an index of a sharded collection that is inconsistent between different shards',
    details: {
    namespace: 'test.reviews',
    info: {
    missingFromShards: [ 'shard02' ],
    inconsistentProperties: [],
    indexName: 'page_1_score_1'
    }
    }
    }
    ]
    },
    ok: 1,
    '$clusterTime': {
    clusterTime: Timestamp({ t: 1752574769, i: 1 }),
    signature: {
    hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
    keyId: Long('0')
    }
    },
    operationTime: Timestamp({ t: 1752574760, i: 1 })
    }

    La salida indica dos inconsistencias para la colección fragmentada test.reviews:

    1. Un índice denominado reviewDt_1 tiene propiedades inconsistentes entre las particiones de la colección; específicamente, las propiedades expireAfterSeconds difieren.

    2. Falta un índice llamado page_1_score_1 en la colección en shard02.

Para resolver la inconsistencia donde falta un índice de la colección en un fragmento en particular,

Puedes:

  • Emita una creación de índices db.collection.createIndex() desde una mongos instancia. La operación solo compila el índice de la colección en la partición o particiones que les falta el índice.

    -O-

  • Realiza una creación de índices progresiva para la colección en la(s) partición(es) afectada(s).

    Nota

    Los índices continuos pueden afectar negativamente a su proceso de implementación. Para obtener información sobre cuándo usar esta creación de índices, consulta Construcciones de índice continuas.

Advertencia

Evita realizar procesos de creación de índices en modo continuo y replicado al mismo tiempo, ya que podría generar problemas inesperados, como compilaciones fallidas y bucles de fallos.

Para resolver dónde difieren las propiedades del índice entre las particiones,

Elimine el índice incorrecto de la colección en los fragmentos afectados y reconstruya el índice. Para ello, puede:

  • Emita una creación de índices db.collection.createIndex() desde una mongos instancia. La operación solo compila el índice de la colección en la partición o particiones que les falta el índice.

    -O-

  • Realiza una creación de índices continua para la colección en la partición afectada.

    Nota

    Los índices continuos pueden afectar negativamente a su proceso de implementación. Para obtener información sobre cuándo usar esta creación de índices, consulta Construcciones de índice continuas.

Alternativamente, si la inconsistencia es la propiedad expireAfterSeconds, puede ejecutar el comando collMod para actualizar el número de segundos en lugar de eliminar y volver a crear el índice.

Volver

Crear en clústeres fragmentados

En esta página