modificar - Comprobando si existe un índice en mongodb
mongodb ejemplos (4)
¿Tal vez podamos usar algo como https://docs.mongodb.com/v3.2/reference/method/db.collection.getIndexes/#db.collection.getIndexes para verificar si la colección tiene un índice igual a algo?
Si es así, suelte y agregue el nuevo o agregue el nuevo directamente
¿Hay un comando que pueda usar a través de javascript en el shell mongo que pueda usarse para verificar si el índice en particular existe en mi mongodb? Estoy construyendo un archivo de script que crearía índices. Me gustaría que si ejecutara este archivo varias veces, los índices que ya existen no se vuelvan a crear.
Puedo usar db.collection.getIndexes () para obtener la colección de todos los índices en mi base de datos y luego construir una lógica para ignorar las que ya existen, pero me preguntaba si existe un comando para obtener un índice y luego ignorar una secuencia de comandos Eso crea el índice. Algo como:
If !exists(db.collection.exists("indexname"))
{
create db.collectionName.CreateIndex("IndexName")
}
Crear índices en MongoDB es una operación idempotente. Por lo tanto, ejecutar db.names.createIndex({name:1})
creará el índice solo si no existiera ya.
El alias en desuso (a partir de MongoDB 3.0) para createIndex () es asegurarIndex (), que es un poco más claro de lo que createIndex()
realmente hace.
Edición: Gracias a ZitRo por aclarar en los comentarios que llamar a createIndex()
con el mismo nombre pero con opciones diferentes a las de un índice existente generará un error MongoError: Index with name: **indexName** already exists with different options
como se explica en esta pregunta .
Si tiene otras razones para verificar, entonces puede acceder a los datos del índice actual de una de dos maneras:
- A partir de v3.0, podemos usar
db.names.getIndexes()
dondenames
es el nombre de la colección. Docs aqui - Antes de v3.0, puede acceder a la colección
system.indexes
y hacer unafind
como se describe a continuación .
En mi caso hice lo siguiente.
DBCollection yourcollectionName = mt.getCollection("your_collection");
if (yourcollectionName.getIndexInfo() == null || yourcollectionName.getIndexInfo().isEmpty()) {
DBObject indexOptions = new BasicDBObject();
indexOptions.put("pro1", 1);
indexOptions.put("pro2", 1);
yourcollectionName.createIndex(indexOptions, "name_of_your_index", true);
}
Utilice db.system.indexes y busque en él.
Si, por ejemplo, tiene un índice llamado ''nombre de índice'', puede buscarlo así:
db.system.indexes.find({''name'':''indexname''});
Si necesita buscar ese índice en una colección específica, entonces necesita usar la propiedad ns (y sería útil tener el nombre de la base de datos).
db.system.indexes.find({''name'':''indexname'', ''ns'':''dbname.collection''});
O, si absolutamente odias incluir el nombre de db ...
db.system.indexes.find({''name'':''indexname'', ''ns'': {$regex:''.collection$''}});
Tirando de eso juntos ...
Entonces, has terminado el cheque sería:
if(db.system.indexes.find({name:''indexname'',ns:{$regex:''.collection$''}}).count()==0) {
db.collection.createIndex({blah:1},{name:''indexname''})
}