所以我有这个索引
db.contact.ensureIndex(
{
'first_name':1,
'last_name':1,
'company_name':1,
'title':1,
'email':1,
'phone_number':1,
'state':1,
'list_id':1
});
如果我使用$or
运行此查询,则索引未被使用
db.contact.find(
{
$or: [
{'first_name':/sales/i},
{'last_name':/sales/i},
{'company_name':/sales/i},
{'title':/sales/i},
{'email':/sales/i},
{'phone_number':/sales/i},
{'state':/sales/i}
]
}).explain();
输出:
{
"cursor" : "BasicCursor", //Btree Index not being used !?
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 0,
"nscanned" : 0,
"nscannedObjectsAllPlans" : 0,
"nscannedAllPlans" : 0,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"server" : "",
"filterSet" : false
}
答案 0 :(得分:1)
给出以下文档:
(1){first_name: 'sales', last_name: 'something', company_name: 'something'},
(2){first_name: 'something', last_name: 'sales', company_name: 'something'},
(3){first_name: 'something', last_name: 'something', company_name: 'sales'}
您希望在结果中获得所有这些内容 因此,如果mongodb使用{first_name:1,last_name:1,company_name:1})索引,它将自动排除记录第二和第三,因为在这两种情况下first_name是不同的。因此,为了获得剩余的文档,您无论如何都必须扫描所有文档。
PS
看来你是在查询空集合吗?