Docs Menu
Docs Home
/ /

Gestionar índices

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

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 de una colección, utilice el db.collection.getIndexes() método o similar método para su conductor.

Por ejemplo, para ver todos los índices de la colección people, ejecute 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 enumerar todos los índices de un tipo determinado (como hash o texto) para todas las colecciones en todas las bases de datos, ejecute el siguiente comando mongosh en:

// 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 de una colección en MongoDB Compass, haga clic en la colección de destino en el panel izquierdo y seleccione el Indexes tab.

Ver índices de 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 elimina un índice que se usa activamente en producción, su aplicación podría sufrir una degradación del rendimiento. Antes de eliminar un índice, puede evaluar el posible impacto ocultándolo.

Los índices ocultos no se utilizan para admitir consultas. Si oculta un índice y observa un impacto negativo considerable en el rendimiento, considere conservarlo y mostrarlo para que las consultas puedan reanudarlo.

Para saber cómo eliminar un índice existente, consulte Eliminar un índice.

Para saber cómo eliminar un índice en MongoDB Compass, consulte Administrar índices en Compass.

Para modificar un índice existente en MongoDB Shell, es necesario eliminarlo y volver a crearlo. La excepción a esta regla son los índices TTL, que pueden modificarse mediante el comando junto collMod index con el indicador de colección.

Para modificar un índice existente en MongoDB Compass, debe eliminar y volver a crear el índice.

Si elimina un índice que se usa activamente en producción, su aplicación podría sufrir una degradación del rendimiento. Para garantizar que las consultas puedan seguir usando un índice durante la modificación, puede crear un índice temporal y redundante que contenga los mismos campos que el índice modificado.

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

1

Ejecute este comando:

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

El comando devuelve el nombre del índice:

url_1
2

Ejecute este comando:

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

El comando devuelve el nombre del índice:

url_1_dummyField_1

Este índice temporal le permite eliminar de forma segura el índice { "url": 1 } original sin afectar el rendimiento.

3

Ejecute este comando:

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

El comando devuelve:

{ nIndexesWas: 3, ok: 1 }
4

Ejecute este comando:

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

El comando devuelve el nombre del índice:

url_1

El índice url_1 se vuelve a crear y puede eliminar el índice temporal sin afectar el rendimiento. Las consultas en el campo url pueden usar el nuevo índice único.

5

Ejecute este comando:

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

El comando devuelve:

{ nIndexesWas: 3, ok: 1 }
6

Para ver los índices de la colección siteAnalytics, ejecute este comando:

db.siteAnalytics.getIndexes()

El comando devuelve estos índices, lo que indica que el índice url_1 ahora es ú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.

De manera predeterminada, el servidor de configuración principal verifica si hay inconsistencias de índice en los fragmentos para las colecciones fragmentadas, y el serverStatus comando, cuando se ejecuta en el servidor de configuración principal, devuelve el campo shardedIndexConsistency para informar la cantidad de colecciones fragmentadas con inconsistencias de índice.

Si informa alguna inconsistencia en shardedIndexConsistency checkMetadataConsistency el checkIndexes: true índice, puede ejecutar el comando con para sus colecciones fragmentadas para 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:

  • Ejecute una compilación de índice db.collection.createIndex() desde una instancia. La operación solo compila el índice de la colección en los fragmentos que no lo mongos tienen.

    -O-

  • Realice una compilación de índice móvil para la colección en los fragmentos afectados.

    Nota

    Los índices rotativos pueden afectar negativamente a la implementación. Para obtener información sobre cuándo usar esta compilación de índice, consulte Compilaciones de índices rotativos.

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 los fragmentos,

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

  • Ejecute una compilación de índice db.collection.createIndex() desde una instancia. La operación solo compila el índice de la colección en los fragmentos que no lo mongos tienen.

    -O-

  • Realice una compilación de índice móvil para la colección en el fragmento afectado.

    Nota

    Los índices rotativos pueden afectar negativamente a la implementación. Para obtener información sobre cuándo usar esta compilación de índice, consulte Compilaciones de índices rotativos.

Alternativamente, si la inconsistencia es la expireAfterSeconds propiedad, puede ejecutar el comando para actualizar la cantidad de segundos en lugar de eliminar y reconstruir el collMod índice.

Volver

Crear en clústeres fragmentados

En esta página