MongoDB 7.0升级前须清理四类问题索引:1.含background:false、dropDups:true或unique+sparse:false且含null值的索引;2.分片集合非_id索引未以分片键最左前缀开头;3.文本索引含非1排序方向;4.隐藏索引或部分索引含不支持的$regex根级过滤。

在 MongoDB 7.0 升级前,必须识别并清理那些因历史索引配置(如已弃用的选项、非法字段组合或不支持的排序方向)导致升级失败或运行异常的索引,否则升级过程可能中断,或升级后查询报错、索引失效甚至写入阻塞。
检查是否存在已弃用的索引选项
连接到目标 mongod 实例(副本集需连主节点),执行:db.runCommand({ listIndexes: "集合名" }),逐个查看每个索引的 options 字段。
重点筛查以下三项:【background: false】(MongoDB 7.0 要求所有新创建索引默认 background:true,显式设为 false 将被拒绝)、【dropDups: true】(自 3.0 起废弃,7.0 完全移除,若存在该字段则升级校验失败)、unique: true 与 sparse: false 组合但字段含 null 值——这在 7.0 中会触发唯一约束冲突。
若发现 dropDups 字段,必须在升级前删除该索引并重建,不可保留。
验证分片集合索引是否满足分片键前置要求
对已分片集合,运行 sh.status() 确认分片状态,再执行 db.集合名.getIndexes()。
检查每个索引的 key 字段:若集合已分片,则**所有非 _id 索引必须以分片键或其最左前缀开头**。例如分片键为 {region: 1, userId: 1},则允许 {region: 1, createdAt: -1},但禁止 {createdAt: -1, region: 1} 或 {userId: 1}(缺少最左 region)。
不满足此条件的索引在 7.0 升级后将无法用于路由查询,且 mongos 可能拒绝后续涉及该索引的命令。必须重建为合规结构。
定位并清理非法排序方向的文本索引
执行 db.runCommand({ listIndexes: "集合名" }),筛选出 text 类型索引(key 中含 "$**": "text" 或明确字段标注 "fieldName": "text")。
文本索引中**不允许任何字段指定非 1 的排序值**(如 {"title": "text", "score": -1} 是非法的)。MongoDB 7.0 升级器会直接拒绝含此类配置的索引。
方法一:使用 db.集合名.dropIndex("索引名") 删除非法索引;方法二:用 db.集合名.createIndex({title: "text"}, {name: "title_text"}) 重建纯文本索引,彻底剔除排序字段。
扫描隐藏索引与部分索引的兼容性风险
第一步:运行 db.runCommand({ listIndexes: "集合名", includeHidden: true }),确认是否存在 hidden: true 字段的索引。
第二步:对每个索引检查 partialFilterExpression 字段是否存在,若存在,验证其中所有操作符是否属于 7.0 支持子集——特别排除 $regex 作为根级条件(如 { $regex: "..." }),该用法在 7.0 中不被允许用于部分索引过滤表达式。
第三步:对含 partialFilterExpression 的索引,执行 db.集合名.validate({full: true}),观察返回结果中是否出现 "invalidPartialIndex" 提示。若出现,该索引必须删除并按 7.0 规则重写过滤逻辑。

















