summaryrefslogtreecommitdiff
path: root/jstests/core/index_check2.js
blob: 534784e657953590c111ed9381bd2d9114f0f625 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// @tags: [requires_getmore]

t = db.index_check2;
t.drop();

// Include helpers for analyzing explain output.
load("jstests/libs/analyze_plan.js");

for (var i = 0; i < 1000; i++) {
    var a = [];
    for (var j = 1; j < 5; j++) {
        a.push("tag" + (i * j % 50));
    }
    t.save({num: i, tags: a});
}

q1 = {
    tags: "tag6"
};
q2 = {
    tags: "tag12"
};
q3 = {
    tags: {$all: ["tag6", "tag12"]}
};

assert.eq(120, t.find(q1).itcount(), "q1 a");
assert.eq(120, t.find(q2).itcount(), "q2 a");
assert.eq(60, t.find(q3).itcount(), "q3 a");

t.ensureIndex({tags: 1});

assert.eq(120, t.find(q1).itcount(), "q1 a");
assert.eq(120, t.find(q2).itcount(), "q2 a");
assert.eq(60, t.find(q3).itcount(), "q3 a");

// We expect these queries to use index scans over { tags: 1 }.
assert(isIxscan(t.find(q1).explain().queryPlanner.winningPlan), "e1");
assert(isIxscan(t.find(q2).explain().queryPlanner.winningPlan), "e2");
assert(isIxscan(t.find(q3).explain().queryPlanner.winningPlan), "e3");

scanned1 = t.find(q1).explain("executionStats").executionStats.totalKeysExamined;
scanned2 = t.find(q2).explain("executionStats").executionStats.totalKeysExamined;
scanned3 = t.find(q3).explain("executionStats").executionStats.totalKeysExamined;

// print( "scanned1: " + scanned1 + " scanned2: " + scanned2 + " scanned3: " + scanned3 );

// $all should just iterate either of the words
assert(scanned3 <= Math.max(scanned1, scanned2), "$all makes query optimizer not work well");