Mongo Aggregate不使用Index

时间:2014-08-05 08:59:17

标签: mongodb aggregation-framework

我的mongo查询正在使用索引,但如果我使用聚合实现相同的功能,则它不使用索引。

db.collection1.find({Attribute8: "s1000",Attribute9: "s1000"}).sort({Attribute10: 1})

"在find"中使用的光标:" BtreeCursor Attribute8_1_Attribute9_1_Attribute10_1"

 db.collection1.aggregate([
      {
        $match: {
          Attribute8: "s1000",
          Attribute9: "s1000"
        }
      },
      {
        $sort: {
         Attribute10: 1
        }
      }
    ])

"光标用于聚合" :" BtreeCursor"。

有人可以告诉我哪里出错了。我的目标是在聚合方法中使用索引。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

经过一番挖掘后,问题是以下类型的使用限制:

Symbol,MinKey,MaxKey,DBRef,Code和CodeWScope

在这种情况下,Symbol用于包含字符串值,因此索引不起作用。

请在聚合选项中尝试使用Number en set explain to true。


[编辑] 我之前的回答是不正确的。

汇总渠道正在使用' BtreeCursor' (仅当定义的字段具有索引时)才能运行$ match查询并确实使用了确保的索引,请检查" indexBound"用于验证。

确保整个集合在" Attribute08"

上有索引

    db.temps.ensureIndex({Attribute08:1})

$匹配带索引的字段:


    db.temps.aggregate([{$match:{Attribute08:"s1000"}}],{explain:true})

    "allPlans" : [
             {
                     "cursor" : "BtreeCursor ",
                     "isMultiKey" : false,
                     "scanAndOrder" : false,
                     "indexBounds" : {
                             "Attribute08" : [
                                     [
                                             "s1000",
                                             "s1000"
                                     ]
                             ]
                     }
             }
     ]

在没有索引的字段上的$ match下面:


    db.temps.aggregate([{$match:{Attribute09:"s1000"}}],{explain:true})
    "allPlans" : [
            {
                    "cursor" : "BasicCursor",
                    "isMultiKey" : false,
                    "scanAndOrder" : false
            }
    ]