是否有一个命令可以通过mongo shell中的javascript使用,可用于检查我的mongodb中是否存在特定索引。我正在构建一个可以创建索引的脚本文件。我希望如果我多次运行此文件,则不会重新创建已存在的索引。
我可以使用db.collection.getIndexes()来获取我的数据库中所有索引的集合,然后构建一个逻辑来忽略已经存在的那些但我想知道是否有命令来获取索引然后忽略创建索引的脚本。类似的东西:
If !exists(db.collection.exists("indexname"))
{
create db.collectionName.CreateIndex("IndexName")
}
答案 0 :(得分:37)
在MongoDB中创建索引是一种幂等操作。因此,只有当索引尚不存在时,运行db.names.createIndex({name:1})
才会创建索引。
createIndex()的已弃用(从MongoDB 3.0开始)别名是 ensureIndex() ,这对于{{{{ 1}}实际上。
修改强>
感谢ZitRo在评论中澄清,调用createIndex()
具有相同名称但不同于现有索引的选项将引发错误createIndex()
,如this question中所述。
如果您有其他原因需要检查,那么您可以通过以下两种方式之一访问当前索引数据:
MongoError: Index with name: **indexName** already exists with different options
,其中db.names.getIndexes()
是集合的名称。 Docs here。names
集合并执行system.indexes
作为bri describes below。答案 1 :(得分:14)
使用 db.system.indexes 并搜索它。
例如,如果您有一个名为“indexname”的索引,则可以像这样搜索:
db.system.indexes.find({'name':'indexname'});
如果您需要在特定集合上搜索该索引,那么您需要使用ns属性(并且,拥有数据库名称会很有帮助。)
db.system.indexes.find({'name':'indexname', 'ns':'dbname.collection'});
或者,如果你绝对讨厌包含数据库名称......
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'})
}
答案 2 :(得分:0)
也许我们可以使用https://docs.mongodb.com/v3.2/reference/method/db.collection.getIndexes/#db.collection.getIndexes之类的东西来检查集合的索引是否等于某个东西?
如果是,则删除并添加新的或直接添加新的
答案 3 :(得分:0)
在我的情况下,我做了如下。
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);
}
答案 4 :(得分:0)
使用nodeJS MongoDB驱动程序2.2版:
const MongoClient = require('mongodb').MongoClient;
exports.dropOldIndexIfExist = dropOldIndexIfExist;
async function dropOldIndexIfExist() {
try {
const mongoConnection = MongoClient.connect('mongodb://localhost:27017/test');
const indexName = 'name_1';
const isIndexExist = await mongoConnection.indexExists(indexName);
if (isIndexExist === true) {
await mongoConnection.dropIndex(indexName);
}
} catch (err) {
console.error('dropOldIndexIfExist', err.message);
throw err;
}
}