使用$或运算符进行Mongodb索引

时间:2016-02-09 11:52:44

标签: mongodb indexing

我们正在使用mongodb $或运算符来过滤数据。以下查询未使用任何索引。

overflow

我们在集合中定义了以下索引:

索引1

{
    data.username: "xxxxx",
    $or: [
        {
            data.timestamp: {
                $gte: 1428405480000,
                $lte: 1428406380000 
            },
            data.finished: false 
        },
        {
            data.timestamp: {
                $gte: 1428319980000,
                $lte: 1428406380000 
            },
            data.finished: true 
        }
    ]
}

索引2

{ 
    "data.username" : 1.0, 
    "data.uuid" : 1.0, 
    "data.timestamp" : -1.0
}

INDEX3

{ 
    "data.username" : 1.0, 
    "data.userid" : 1.0, 
    "data.timestamp" : 1.0, 
    "data.finished" : 1.0
}

index4

{ 
    "data.username" : 1.0, 
    "data.timestamp" : 1.0, 
    "data.finished" : 1.0
}

MongoDB没有使用上述索引。我们正在使用WiredTiger存储引擎。 explain命令的结果返回explain.queryPlanner。 indexFilterSet = false

1 个答案:

答案 0 :(得分:0)

正如joao强调的那样,documentatation指出,在评估$或表达式中的子句时,MongoDB要么执行集合扫描,要么如果索引支持所有子句,MongoDB会执行索引扫描。也就是说,对于MongoDB使用索引来计算$或表达式,$或表达式中的所有子句必须由索引支持。否则,MongoDB将执行收集扫描。

简而言之,您应该添加以下索引:

{ 
    "data.username" : 1.0
}

{  
   "data.userid" : 1.0  
}

{ 
   "data.timestamp" : 1.0
}

{ 
    "data.finished" : 1.0
}