为什么解释查询输出给我基本光标,即使集合上有索引?

时间:2013-09-10 15:34:52

标签: mongodb

我有一个名为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,即使它上面有索引?

3 个答案:

答案 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" } }

queryorderby的形式,然后您调用一个函数运算符:

explain();

这是MongoDB的一个已知错误,这两个错误不能很好地协同工作,因此产生你得到的输出。

当然,当查询进入并由MongoDB解析时,它将被记录在配置文件中,其中包含查询运算符queryorderby以及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
  • 的其他索引

Reference

关于语法, 实际上是一种不能使用索引的查询语法:$where子句需要评估内联JavaScript,因此无法使用索引。例如:

db.collection.find( { $where: "field1.value > field2.value" } )