【问题标题】:Mongodb indexing with $or operator使用 $or 运算符的 Mongodb 索引
【发布时间】:2016-02-09 22:30:37
【问题描述】:

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

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

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

索引1

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

索引2

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

索引3

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

索引4

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

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

【问题讨论】:

标签: mongodb indexing


【解决方案1】:

正如 joao 所强调的,documentatation 指出,在评估 $or 表达式中的子句时,MongoDB 要么执行集合扫描,要么如果索引支持所有子句,则 MongoDB 执行索引扫描。也就是说,为了让 MongoDB 使用索引来评估 $or 表达式,$or 表达式中的所有子句都必须由索引支持。否则,MongoDB 将执行集合扫描。

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

{ 
    "data.username" : 1.0
}

{  
   "data.userid" : 1.0  
}

{ 
   "data.timestamp" : 1.0
}

{ 
    "data.finished" : 1.0
}

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 2012-12-03
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    相关资源
    最近更新 更多