检查mongodb中是否存在索引

CSC*_*CSC 33 mongodb

是否有一个命令可以通过mongo shell中的javascript使用,可用于检查我的mongodb中是否存在特定索引.我正在构建一个可以创建索引的脚本文件.我希望如果我多次运行此文件,则不会重新创建已存在的索引.

我可以使用db.collection.getIndexes()来获取我的数据库中所有索引的集合,然后构建一个逻辑来忽略已经存在的那些但我想知道是否有命令获取索引然后忽略脚本这会创建索引.就像是:

If !exists(db.collection.exists("indexname")) 
{
    create  db.collectionName.CreateIndex("IndexName")
}
Run Code Online (Sandbox Code Playgroud)

met*_*ame 42

在MongoDB中创建索引是一种幂等操作.因此db.names.createIndex({name:1}),只有当索引尚不存在时,才会创建索引.

不推荐使用(从MongoDB 3.0开始)createIndex()的别名是ensureIndex(),它createIndex()实际上有点清楚.


编辑: 感谢ZitRo在评论中澄清,createIndex()使用相同名称但不同于现有索引的选项调用将引发错误,MongoError: Index with name: **indexName** already exists with different options本问题中所述.


如果您有其他检查原因,则可以通过以下两种方式之一访问当前索引数据:

  1. 自v3.0,我们可以使用db.names.getIndexes()这里names是集合的名称.文档在这里.
  2. 在v3.0之前,您可以访问该system.indexes集合并执行下面的find bri 描述.

  • 请注意,我们可能会通过执行 `createIndex` 来捕获 `MongoError: Index with name: **indexName** already exists with different options` 错误。所以有时使用`db.collection.getIndexes()` 是有意义的。有关更多信息,请参阅 [这个问题](http://stackoverflow.com/q/30232081/2590150)。 (4认同)
  • 我发现`collection.createIndex(DBObject("_ts" -> 1), DBObject("expireAfterSeconds" -> ttl))` 不是幂等的——如果过期值与已经使用的值不同,它将失败。不过,也许这是 MongoDB 菜鸟偶然发现的一个特例。 (2认同)

bri*_*bri 14

使用db.system.indexes并搜索它.

例如,如果您有一个名为"indexname"的索引,则可以像这样搜索它:

db.system.indexes.find({'name':'indexname'});
Run Code Online (Sandbox Code Playgroud)

如果需要在特定集合上搜索该索引,则需要使用ns属性(并且,具有db名称会很有帮助).

db.system.indexes.find({'name':'indexname', 'ns':'dbname.collection'});
Run Code Online (Sandbox Code Playgroud)

或者,如果你绝对讨厌包含数据库名称......

db.system.indexes.find({'name':'indexname', 'ns': {$regex:'.collection$'}});
Run Code Online (Sandbox Code Playgroud)

把它拉到一起......

所以,你完成检查将是:

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

  • @SohamShetty自v3.0起已弃用。现在,您应该使用db.name.getIndexes(),其中“名称”是集合的名称。 (2认同)