Mongodb Mongo find不';不要使用正确的索引

Mongodb Mongo find不';不要使用正确的索引,mongodb,indexing,mongoose,Mongodb,Indexing,Mongoose,我刚刚创建了一个新索引,在mongoose的帮助下添加了它: test.index({"source": 1, "tickers.exchange": 1, "tickers.symbol": 1, "report_date": -1}); 在db中,我可以看到索引添加正确: Index Value: source_1_tickers.exchange_1_tickers.symbol_1_report_date_-1 现在,当我尝试执行与索引非常匹配的查询时,它仍然不会使用此索引,而是使用

我刚刚创建了一个新索引,在mongoose的帮助下添加了它:

test.index({"source": 1, "tickers.exchange": 1, "tickers.symbol": 1, "report_date": -1});
在db中,我可以看到索引添加正确:

Index Value: source_1_tickers.exchange_1_tickers.symbol_1_report_date_-1
现在,当我尝试执行与索引非常匹配的查询时,它仍然不会使用此索引,而是使用另一个索引:

db.getCollection('test').find({
    source: 'testSource',
    'tickers.exchange': { $all: ['TEST_EXCHANGE'] },
    'tickers.symbol': { $all: ['TEST_SYMBOL'] },
    report_date: { $gte: ISODate('2016-07-01T00:00:00.000Z'), 
                   $lte: ISODate('2016-09-30T23:59:59.999Z') },
    change: { $gt: 0 }
})
我使用
explain('executionStats')要查看使用了哪个索引,它会生成以下内容:

tickers.symbol_1_change_1_report_date_1

试图弄清楚为什么您在查询中使用
$all
而不是只使用
'tickers.exchange':'TEST\u exchange'
?是的,我将其更改为'tickers.exchange':'TEST\u exchange',结果仍然相同。它使用另一个索引,因为它对您的查询更有效。如果
tickers
是一个数组,您可能需要
tickers:{$elemMatch:{exchange:'TEST_exchange',symbol:'TEST_symbol'}}
来代替,因为我假设您正在寻找一个与这两个元素都匹配的数组元素。$elemMatch是否增加了性能?@JohnnyHK刚刚切换到$elemMatch,我没有看到任何性能提升。。。嗯,为什么在查询中使用
$all
,而不是只使用
'tickers.exchange':'TEST\u exchange'
?是的,我将其更改为'tickers.exchange':'TEST\u exchange',仍然使用其他索引,因为它对查询更有效。如果
tickers
是一个数组,您可能需要
tickers:{$elemMatch:{exchange:'TEST_exchange',symbol:'TEST_symbol'}}
来代替,因为我假设您正在寻找一个与这两个元素都匹配的数组元素。$elemMatch是否增加了性能?@JohnnyHK刚刚切换到$elemMatch,我没有看到任何性能提升。。。六羟甲基三聚氰胺六甲醚