You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:50:16