Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-38063

executionStats or allPlansExecution level explain of an aggregate with a $out does writes

    • 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.

            Assignee:
            david.storch@mongodb.com David Storch
            Reporter:
            david.storch@mongodb.com David Storch
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: