Files
mongo/jstests/core/optimized_match_explain.js

37 lines
1.4 KiB
JavaScript

// @tags: [
// does_not_support_stepdowns,
// ]
/**
* Tests that the explain output for $match reflects any optimizations.
*/
import {getAggPlanStage} from "jstests/libs/analyze_plan.js";
const coll = db.match_explain;
coll.drop();
assert.commandWorked(coll.insert({a: 1, b: 1}));
assert.commandWorked(coll.insert({a: 2, b: 3}));
assert.commandWorked(coll.insert({a: 1, b: 2}));
assert.commandWorked(coll.insert({a: 1, b: 4}));
// Explain output should reflect optimizations.
// $and should not be in the explain output because it is optimized out.
let explain = coll.explain().aggregate(
[{$sort: {b: -1}}, {$addFields: {c: {$mod: ["$a", 4]}}}, {$match: {$and: [{c: 1}]}}]);
assert.commandWorked(explain);
// Depending on whether the $match can be "pushed down" for SBE, the $match filter may appear in the
// explain plan as a $match pipeline stage or as a MATCH plan stage.
const documentSourceStage = getAggPlanStage(explain, "$match");
const pushedDownFilterStage = getAggPlanStage(explain, "MATCH");
assert(documentSourceStage || pushedDownFilterStage, explain);
if (documentSourceStage) {
assert(documentSourceStage.hasOwnProperty("$match"), documentSourceStage);
assert.eq(documentSourceStage["$match"], {c: {$eq: 1}});
} else {
assert(pushedDownFilterStage.hasOwnProperty("filter"), pushedDownFilterStage);
assert.eq(pushedDownFilterStage.filter, {c: {$eq: 1}});
}