Проверка наличия индекса в mongodb

Есть ли команда, которую я могу использовать с помощью javascript в оболочке mongo, которая может использоваться для проверки того, существует ли конкретный индекс в моем mongodb. Я создаю файл script, который создавал бы индексы. Я хотел бы, чтобы, если я запускаю этот файл несколько раз, то уже существующие индексы не воссоздаются.

Я могу использовать db.collection.getIndexes(), чтобы получить коллекцию всех индексов в моем db, а затем построить логику, чтобы игнорировать те, которые уже существуют, но мне было интересно, есть ли команда для получения индекса, а затем игнорировать a script, который создает индекс. Что-то вроде:

If !exists(db.collection.exists("indexname")) 
{
    create  db.collectionName.CreateIndex("IndexName")
}

Ответы

Ответ 1

Создание индексов в MongoDB является идемпотентной операцией. Таким образом, запуск db.names.createIndex({name:1}) приведет к созданию индекса только в том случае, если он еще не существует.

Устаревший (как и у MongoDB 3.0) псевдоним для createIndex() - это securityIndex(), который немного ясен, что на самом деле делает createIndex().


Edit: Спасибо ZitRo за пояснение в комментариях, что вызов createIndex() с тем же именем, но с разными параметрами, чем существующий индекс, выдает ошибку MongoError: Index with name: **indexName** already exists with different options, как описано в этом вопросе.


Если у вас есть другие причины для проверки, вы можете получить доступ к текущим данным индекса одним из двух способов:

  • Начиная с версии 3.0, мы можем использовать db.names.getIndexes(), где names - это имя коллекции. Документы здесь.
  • Перед v3.0 вы можете получить доступ к коллекции system.indexes и сделать find как bri ниже).

Ответ 2

Используйте db.system.indexes и выполните поиск по нему.

Если, например, у вас есть индекс с именем 'indexname', вы можете его искать следующим образом:

db.system.indexes.find({'name':'indexname'});

Если вам нужно найти этот индекс в определенной коллекции, вам нужно использовать свойство ns (и было бы полезно иметь имя db).

db.system.indexes.find({'name':'indexname', 'ns':'dbname.collection'});

Или, если вы абсолютно ненавидите, включая имя db...

db.system.indexes.find({'name':'indexname', 'ns': {$regex:'.collection$'}});

Стянув это вместе...

Итак, вы закончили проверку:

if(db.system.indexes.find({name:'indexname',ns:{$regex:'.collection$'}}).count()==0) { 
    db.collection.createIndex({blah:1},{name:'indexname'}) 
}