Details
Description
The following two queries should have the same shape:
> db.foo.getPlanCache().listQueryShapes()
|
[ ]
|
> db.foo.find({a:1},{b:1,a:1})
|
> db.foo.find({a:1},{a:1,b:1})
|
> db.foo.getPlanCache().listQueryShapes()
|
[
|
{
|
"query" : { |
"a" : 1 |
},
|
"sort" : { |
|
},
|
"projection" : { |
"a" : 1, |
"b" : 1 |
}
|
},
|
{
|
"query" : { |
"a" : 1 |
},
|
"sort" : { |
|
},
|
"projection" : { |
"b" : 1, |
"a" : 1 |
}
|
}
|
]
|
Not only do some drivers (e.g. pymongo) store projection specifiers in unordered maps, but the shell and drivers also re-order projection specifiers (e.g. to move the _id projection to the front), so a user can't easily determine the order of a projection just from looking at application code:
> db.foo.getPlanCache().listQueryShapes()
|
[ ]
|
> db.foo.find({a:1},{a:1,_id:0}) // user enters _id:0 last.... |
> db.foo.getPlanCache().listQueryShapes()
|
[
|
{
|
"query" : { |
"a" : 1 |
},
|
"sort" : { |
|
},
|
"projection" : { |
"_id" : 0, // ... but the shell re-orders it to be first |
"a" : 1 |
}
|
}
|
]
|
>
|
Attachments
Issue Links
- is related to
-
SERVER-13008 Encoding of projection for query plan cache should be type-insensitive
-
- Closed
-