Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongo Aggregate not using Index

My mongo find query is using an index, but the same functionality if I am implementing using aggregate, it is not using the Index.

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

"cursor used in find" : "BtreeCursor Attribute8_1_Attribute9_1_Attribute10_1"

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

"cursor used in aggregate" : "BtreeCursor ".

Can someone tell me where it went wrong. My goal is to use Indexes in aggregate method. Thanks in advance.

like image 566
user2846870 Avatar asked Mar 25 '26 13:03

user2846870


1 Answers

After some digging the issue is the limitation of usage of the following types:

Symbol, MinKey, MaxKey, DBRef, Code, and CodeWScope

In this case Symbol is used for containing a string value, so index wont work.

Please try with a Number en set explain to true in the aggregate option.


[EDIT] My previous answer is incorrect.

The aggregation pipeline is using a 'BtreeCursor' (only when the defined field has an index) to run the $match query and does uses the ensured index, check "indexBound" for verification.

Ensuring the whole collection to have an index on "Attribute08"


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

$match on a field with an index:


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

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

Below the $match on a field without index:


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

like image 86
Kevin Avatar answered Mar 27 '26 04:03

Kevin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!