Проверка наличия индекса в 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'})
}
Ответ 3
возможно, мы можем использовать что-то вроде https://docs.mongodb.com/v3.2/reference/method/db.collection.getIndexes/#db.collection.getIndexes, чтобы проверить, имеет ли индекс индекс, равный чему-то?
если да, затем отбросьте и добавьте новый или добавьте новый.