Details
-
Bug
-
Resolution: Fixed
-
Major - P3
-
4.0.4, 4.1.5
-
None
-
Minor Change
-
ALL
-
15
Description
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.
Attachments
Issue Links
- is documented by
-
DOCS-12249 Docs for SERVER-38063: executionStats or allPlansExecution level explain of an aggregate with a $out does writes
-
- Closed
-
- 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
-