我有一个名为stocks的集合,我在其上创建了一个复合索引,如下所示
db.stocks.ensureIndex({"symbol":1,"date":1,"type": 1, "isValid": 1,"rootsymbol":1,"price":1},{"unique" : false})
我设置了profilinglevel,找出所有慢速查询。
下面的查询之一花了38毫米,当确实解释时,这是以下结果
抱歉,我已更新了我的问题
db.stocks.find({ query: { symbol: "AAPLE", date: "2014-01-18", type: "O", isValid: true }, orderby: { price: "1" } }).explain();
{
"cursor" : "BasicCursor",
"nscanned" : 705402,
"nscannedObjects" : 705402,
"n" : 0,
"millis" : 3456,
"indexBounds" : {
}
}
我的问题是它为什么显示一个BasicCursor,即使它上面有索引?
答案 0 :(得分:4)
我很确定这里的问题是你使用find()
函数。您正在指定query
参数,并在其中放置搜索条件。我认为你不需要实际放置query
。只需插入搜索条件即可。像这样:
db.stocks.find({
symbol: "AAPLE",
date: "2014-01-18",
type: "O",
isValid: true
}).sort( { "price": 1} ).explain();
另请注意我对排序的更改。您可以阅读有关排序游标here的更多信息。
答案 1 :(得分:1)
由于实际上没有描述问题,我将继续描述它。
您正在使用功能运算符调用顶级查询运算符。例如,您可以在此处调用查询运算符:
{ query: { symbol: "AAPLE", date: "2014-01-18", type: "O", isValid: true }, orderby: { price: "1" } }
以query
和orderby
的形式,然后您调用一个函数运算符:
explain();
这是MongoDB的一个已知错误,这两个错误不能很好地协同工作,因此产生你得到的输出。
当然,当查询进入并由MongoDB解析时,它将被记录在配置文件中,其中包含查询运算符query
和orderby
以及maxscan
等。
调用命令时这是一个更大的问题。
参考:MongoDB $query operator ignores index?我无法找到实际的JIRA,但这是相关的。
编辑:我认为这模糊地代表了它:https://jira.mongodb.org/browse/SERVER-6767
答案 2 :(得分:0)
语法不是问题。为了使MongoDB使用复合索引(即包含多个字段的索引),查询/排序中的字段必须是索引字段的前缀。在这种情况下,您的索引包括以下字段:symbol,date,type,isValid,rootsymbol和price。您的查询/排序包括除 rootsymbol
以外的所有字段,因此无法使用索引。可能的解决方案:
rootsymbol
,或rootsymbol
添加到您的查询或rootsymbol
关于语法, 实际上是一种不能使用索引的查询语法:$where
子句需要评估内联JavaScript,因此无法使用索引。例如:
db.collection.find( { $where: "field1.value > field2.value" } )