是否有一个命令可以通过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如本问题中所述.
如果您有其他检查原因,则可以通过以下两种方式之一访问当前索引数据:
db.names.getIndexes()这里names是集合的名称.文档在这里.system.indexes集合并执行下面的find bri 描述.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)
| 归档时间: |
|
| 查看次数: |
23549 次 |
| 最近记录: |