我们正在使用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
答案 0 :(得分:0)
正如joao强调的那样,documentatation指出,在评估$或表达式中的子句时,MongoDB要么执行集合扫描,要么如果索引支持所有子句,MongoDB会执行索引扫描。也就是说,对于MongoDB使用索引来计算$或表达式,$或表达式中的所有子句必须由索引支持。否则,MongoDB将执行收集扫描。
简而言之,您应该添加以下索引:
{
"data.username" : 1.0
}
{
"data.userid" : 1.0
}
{
"data.timestamp" : 1.0
}
{
"data.finished" : 1.0
}