Files
mongo/jstests/core/explain_multi_plan.js
Charlie Swanson 7e4fe022c0 SERVER-40397 Add pipeline updates to findAndModify
Adds the ability to specify an array representing an aggregation
pipeline to the 'udpate' argument of findAndModify. Certain options like
'sort' and 'fields' are not yet supported.
2019-04-30 21:28:47 -04:00

81 lines
2.8 KiB
JavaScript

// @tags: [
// # Cannot implicitly shard accessed collections because of following errmsg: A single
// # update/delete on a sharded collection must contain an exact match on _id or contain the
// # shard key.
// assumes_unsharded_collection,
// ]
/**
* Tests running explain on a variety of explainable commands (find, update, remove, etc.) when
* there are multiple plans available. This is a regression test for SERVER-20849 and SERVER-21376.
*/
(function() {
"use strict";
var coll = db.explainMultiPlan;
coll.drop();
// Create indices to ensure there are multiple plans available.
assert.commandWorked(coll.ensureIndex({a: 1, b: 1}));
assert.commandWorked(coll.ensureIndex({a: 1, b: -1}));
// Insert some data to work with.
var bulk = coll.initializeOrderedBulkOp();
var nDocs = 100;
for (var i = 0; i < nDocs; ++i) {
bulk.insert({a: i, b: nDocs - i});
}
bulk.execute();
// SERVER-20849: The following commands should not crash the server.
assert.doesNotThrow(function() {
coll.explain("allPlansExecution").update({a: {$gte: 1}}, {$set: {x: 0}});
});
assert.doesNotThrow(function() {
coll.explain("allPlansExecution").remove({a: {$gte: 1}});
});
assert.doesNotThrow(function() {
coll.explain("allPlansExecution").findAndModify({query: {a: {$gte: 1}}, remove: true});
});
assert.doesNotThrow(function() {
coll.explain("allPlansExecution").findAndModify({query: {a: {$gte: 1}}, update: {y: 1}});
});
assert.doesNotThrow(function() {
coll.explain("allPlansExecution").find({a: {$gte: 1}}).finish();
});
assert.doesNotThrow(function() {
coll.explain("allPlansExecution").count({a: {$gte: 1}});
});
assert.doesNotThrow(function() {
coll.explain("allPlansExecution").distinct("a", {a: {$gte: 1}});
});
// SERVER-21376: Make sure the 'rejectedPlans' field is filled in appropriately.
function assertHasRejectedPlans(explainOutput) {
var queryPlannerOutput = explainOutput.queryPlanner;
// The 'rejectedPlans' section will be in a different place if passed through a mongos.
if ("SINGLE_SHARD" == queryPlannerOutput.winningPlan.stage) {
var shards = queryPlannerOutput.winningPlan.shards;
shards.forEach(function assertShardHasRejectedPlans(shard) {
assert.gt(shard.rejectedPlans.length, 0);
});
} else {
assert.gt(queryPlannerOutput.rejectedPlans.length, 0);
}
}
var res = coll.explain("queryPlanner").find({a: {$gte: 1}}).finish();
assert.commandWorked(res);
assertHasRejectedPlans(res);
res = coll.explain("executionStats").find({a: {$gte: 1}}).finish();
assert.commandWorked(res);
assertHasRejectedPlans(res);
}());