-
Type: Bug
-
Resolution: Fixed
-
Priority: Major - P3
-
Affects Version/s: 4.0.4, 4.1.5
-
Component/s: Aggregation Framework, Diagnostics
-
None
-
Minor Change
-
ALL
-
15
We allow explaining write operations such as the update and delete commands. However, these operations are never supposed to perform writes. An explain of an $out aggregation stage should behave similarly. However, an "executionStats" or "allPlansExecution" verbosity explain of an $out will actually persist the results to the target collection:
> db.inputColl.drop() false > db.inputColl.insert({_id: 1}) WriteResult({ "nInserted" : 1 }) > db.inputColl.explain("executionStats").aggregate([{$out: "outputColl"}]) { "stages" : [ { "$cursor" : { "query" : { }, "queryPlanner" : { "plannerVersion" : 1, "namespace" : "test.inputColl", "indexFilterSet" : false, "parsedQuery" : { }, "queryHash" : "8B3D4AB8", "planCacheKey" : "8B3D4AB8", "winningPlan" : { "stage" : "COLLSCAN", "direction" : "forward" }, "rejectedPlans" : [ ] }, "executionStats" : { "executionSuccess" : true, "nReturned" : 1, "executionTimeMillis" : 59, "totalKeysExamined" : 0, "totalDocsExamined" : 1, "executionStages" : { "stage" : "COLLSCAN", "nReturned" : 1, "executionTimeMillisEstimate" : 0, "works" : 3, "advanced" : 1, "needTime" : 1, "needYield" : 0, "saveState" : 2, "restoreState" : 2, "isEOF" : 1, "direction" : "forward", "docsExamined" : 1 } } } }, { "$out" : { "to" : "outputColl", "db" : "test", "mode" : "replaceCollection", "uniqueKey" : { "_id" : 1 } } } ], "ok" : 1 } > db.outputColl.find() { "_id" : 1 }
This behavior was most likely introduced by the fixes to executionStats agg explain under SERVER-29421.
Instead, we should probably raise an error if a user attempts to perform this operation with an error message such as "$out cannot be explain with 'executionStats' level verbosity or higher". Users who wish to explain an $out operation with execution stats can simply drop the $out stage from the tail of their pipeline.
- is related to
-
SERVER-29421 Aggregation executionStats or allPlansExecution explain modes behave incorrectly with $limit
- Closed
- related to
-
SERVER-38064 Pipeline::dispose() should not check for stale databaseVersion
- Closed