首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取mongodb部署的所有索引

获取mongodb部署的所有索引
EN

Stack Overflow用户
提问于 2022-02-09 21:09:08
回答 1查看 113关注 0票数 0

请帮助我处理mongodb查询,它将返回mongodb部署中的所有索引。此外,此查询将排除视图,并且只接受集合。请帮我同样的忙。

下面的命令可以工作,但是无法处理“视图”。

代码语言:javascript
复制
test01_rs:PRIMARY>  db.adminCommand('listDatabases').databases.forEach(function(e){ if ((e.name == "admin" || e.name == "config" || e.name == "local")) return; var database=e.name; context=db.getSiblingDB(database); context.getCollectionNames().forEach(function(collection){ records=context.getCollection(collection).aggregate( [ { $indexStats: { } }, { "$group" : { _id : { name: "$name"}, accesses:{$sum:"$accesses.ops"}, since:{$min:"$accesses.since"}, } }, { "$project": { _id:0, name:"$_id.name", since:{ $dateToString: { format: "%Y-%m-%d-%H:%M:%S", date: "$since" } }, accesses:"$accesses", } } ] ).forEach(function(index){ idx=index.name; since=index.since; accesses=index.accesses; print(database+";"+collection+";"+idx+";"+since+";"+accesses); }); }); });

测试03;虚报;id;2022-01-10-17:31:26;0 Test05 04;fahed;id;2022-01-10-17:31:26;0 Test05 05;fahed;id;2022-01-10-17:31:26;0

谢谢你,法德

EN

回答 1

Stack Overflow用户

发布于 2022-02-09 21:51:43

选项1:

代码语言:javascript
复制
db.adminCommand( { listDatabases: 1 } ).databases.forEach(
    function(d){
      print('databaseName:'+d.name);
      db.getSiblingDB(d.name).getCollectionInfos({type:"collection"}).forEach(
        function(collection){ indexes = 
          db.getSiblingDB(d.name).getCollection(collection.name).getIndexes();
          print("Indexes on "+d.name+"."+ collection.name + ":");
          printjson(indexes) 
         })
      })

这将为您提供如下输出:

代码语言:javascript
复制
 databaseName:x
 Indexes on x.col1:
 [ { v: 2, key: { _id: 1 }, name: '_id_' } ]
 databaseName:y
 Indexes on y.col2:
 [ { v: 2, key: { _id: 1 }, name: '_id_' } ]

解释:

  1. Get数组,其中包含有listDatabase:1命令的数据库名称列表。提供的数据库列表上的
  2. 循环和getCOllectionInfos (仅过滤类型为:集合的集合以排除视图)提供集合列表上的
  3. 循环,并执行getIndexes()以根据请求列出所有索引。

用mongosh 0.12.1 / mongod 4.4.12测试

备选方案2:

代码语言:javascript
复制
    db.adminCommand( { listDatabases: 1 } ).databases.forEach(function(d){ print('databaseName:'+d.name);db.getSiblingDB(d.name).getCollectionInfos({type:"collection"}).forEach(function(collection){ indexes = db.getSiblingDB(d.name).getCollection(collection.name).aggregate([ {$indexStats:{}} ]); indexes.forEach(function(idx){   print("Indexes on "+d.name+"."+ collection.name + ": idx:"+idx.name+" ,since:"+idx.accesses.since+" accesses:"+idx.accesses.ops  ); } )    }) })

对于这个选项,您需要向用户添加一些额外的权限.

这里,从$indexStats中获取的索引详细信息包含了从access中获取的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71056749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档