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

MongoDB聚合管道$or查询未使用索引扫描问题排查

MongoDB聚合$or查询未触发索引扫描的问题解决

问题场景

我在构建聚合管道时,第一个阶段使用$or条件做匹配,但通过explain()分析执行计划时,发现MongoDB并未使用索引扫描,而是执行了全表扫描。

使用的聚合管道代码如下(已修正原代码中$or数组的语法格式错误):

pipeline = [
    {
        $match: {
            $or: [
                { activeTill: Date.now() },
                { deleteReason: CONSTANT.NOT_HAPPY }
            ]
        }
    }
];

当前索引情况:仅为deleteReason字段创建了单字段索引,activeTill字段未创建任何索引。

问题原因

MongoDB的$or查询在利用索引时有明确规则:$or中的每一个子查询条件,都必须对应一个独立的单字段索引(或能匹配该条件的复合索引)。只要有一个子条件没有匹配的索引,查询优化器就会判定无法通过索引高效筛选所有符合条件的文档,进而选择全表扫描。

解决方法

为activeTill字段创建单字段索引:

db.yourCollectionName.createIndex({ activeTill: 1 })

索引创建完成后,再次执行explain()查看执行计划,就能看到MongoDB分别通过activeTill和deleteReason的索引扫描符合条件的文档,再合并结果,实现索引优化的查询。

内容的提问来源于stack exchange,提问作者V0idHat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:35:24