如何在MongoDB未使用索引列表中排除TTL索引?
解决MongoDB未使用索引排查中排除TTL索引的问题
我来帮你搞定这个问题!你现有的代码已经能筛选出未被使用(accesses.ops == 0)且非_id_的索引,现在只需要添加一个判断条件,把带有expireAfterSeconds的TTL索引排除掉就行。
关键分析
TTL索引的特征是在索引的spec字段中包含expireAfterSeconds属性(从你给出的输出也能看到这一点),所以我们只需要在判断逻辑中增加对这个属性的检查,跳过存在该属性的索引即可。
修改后的完整代码
db.getMongo().getDBNames().forEach(function (dbname) { if (dbname != "admin") { db.getSiblingDB(dbname).getCollectionNames().forEach(function (cname) { const output = db.getSiblingDB(dbname)[cname].aggregate({$indexStats:{}}); output.forEach(function(findUnused) { // 新增判断:排除带有expireAfterSeconds的TTL索引 if (findUnused.accesses.ops == 0 && findUnused.name != "_id_" && !findUnused.spec?.expireAfterSeconds) { print(dbname + " \t" + cname + " \t" + JSON.stringify(findUnused)); } }) }) } })
代码说明
- 新增的
!findUnused.spec?.expireAfterSeconds逻辑:- 使用可选链操作符
?.避免当索引没有spec字段时出现报错(虽然这种情况很少见,但能提升代码健壮性) - 当
spec中存在expireAfterSeconds属性时,这个条件会返回false,从而跳过该索引的输出
- 使用可选链操作符
这样修改后,你之前示例中带有"expireAfterSeconds":1234567的TTL索引就不会被打印出来了,只会输出真正未被使用的非TTL、非_id索引。
内容的提问来源于stack exchange,提问作者ribbit
相关产品推荐
相关产品推荐

