-
Type: Improvement
-
Resolution: Unresolved
-
Priority: Major - P3
-
None
-
Affects Version/s: 2.6.0
-
Component/s: Aggregation Framework
-
Query Optimization
-
Fully Compatible
-
Query 2017-03-27, Query 2017-04-17, QO 2022-10-03
-
(copied to CRM)
Even though the user explicitly tells us to include specific fields, we can see that they are not actually being used, so doesn't it make sense to optimize $project away the same as if it wasn't there?
db.t1.aggregate([ {$match:{username:/^user8/}}, {$project:{username:1}},{$group:{_id:1,count:{$sum:1}}}],{explain:true}) { "stages" : [ { "$cursor" : { "query" : { "username" : /^user8/ }, "fields" : { "username" : 1, "_id" : 1 }, "plan" : { "cursor" : "BtreeCursor username_1", "isMultiKey" : false, "scanAndOrder" : false, "indexBounds" : { "username" : [ [ "user8", "user9" ], [ /^user8/, /^user8/ ] ] }, "allPlans" : [ { "cursor" : "BtreeCursor username_1", "isMultiKey" : false, "scanAndOrder" : false, "indexBounds" : { "username" : [ [ "user8", "user9" ], [ /^user8/, /^user8/ ] ] } } ] } } }, { "$project" : { "username" : true } }, { "$group" : { "_id" : { "$const" : 1 }, "count" : { "$sum" : { "$const" : 1 } } } } ]
Without the (needless) $project
db.t1.aggregate([ {$match:{username:/^user8/}}, {$group:{_id:1,count:{$sum:1}}}],{explain:true}) { "stages" : [ { "$cursor" : { "query" : { "username" : /^user8/ }, "fields" : { "_id" : 0, "$noFieldsNeeded" : 1 }, "plan" : { "cursor" : "BtreeCursor username_1", "isMultiKey" : false, "scanAndOrder" : false, "indexBounds" : { "username" : [ [ "user8", "user9" ], [ /^user8/, /^user8/ ] ] }, "allPlans" : [ { "cursor" : "BtreeCursor username_1", "isMultiKey" : false, "scanAndOrder" : false, "indexBounds" : { "username" : [ [ "user8", "user9" ], [ /^user8/, /^user8/ ] ] } } ] } } }, { "$group" : { "_id" : { "$const" : 1 }, "count" : { "$sum" : { "$const" : 1 } } } } ], "ok" : 1 }
- is duplicated by
-
SERVER-14159 Aggregation framework performances drops significantly when projecting large sub documents
- Closed
-
SERVER-49306 Optimization for mid-pipeline $project stages
- Closed
-
SERVER-82836 UNPACK_TS_BUCKET stage includes fields it doesn't need
- Closed
- related to
-
SERVER-31082 when $count is at the end of multiple stages that don't change the number of documents in pipeline, those stages can be eliminated
- Backlog
-
SERVER-55886 Optimize away unused computed fields
- Backlog
-
SERVER-25120 aggregation requests generated field name from query
- Closed