summaryrefslogtreecommitdiff
path: root/jstests/core/not2.js
blob: 98eb19cee6f78e16006760eb006eacf5a672d5cf (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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
t = db.jstests_not2;
t.drop();

check = function(query, expected, size) {
    if (size == null) {
        size = 1;
    }
    assert.eq(size, t.find(query).itcount(), tojson(query));
    if (size > 0) {
        assert.eq(expected, t.findOne(query).i, tojson(query));
    }
};

fail = function(query) {
    try {
        t.find(query).itcount();
        assert(false, tojson(query));
    } catch (e) {
        // expected
    }
};

doTest = function() {

    t.remove({});

    t.save({i: "a"});
    t.save({i: "b"});

    fail({i: {$not: "a"}});
    // SERVER-12735: We currently do not handle double negatives
    // during query canonicalization.
    // fail( {i:{$not:{$not:"a"}}} );
    // fail( {i:{$not:{$not:{$gt:"a"}}}} );
    fail({i: {$not: {$ref: "foo"}}});
    fail({i: {$not: {}}});
    check({i: {$gt: "a"}}, "b");
    check({i: {$not: {$gt: "a"}}}, "a");
    check({i: {$not: {$ne: "a"}}}, "a");
    check({i: {$not: {$gte: "b"}}}, "a");
    check({i: {$exists: true}}, "a", 2);
    check({i: {$not: {$exists: true}}}, "", 0);
    check({j: {$not: {$exists: false}}}, "", 0);
    check({j: {$not: {$exists: true}}}, "a", 2);
    check({i: {$not: {$in: ["a"]}}}, "b");
    check({i: {$not: {$in: ["a", "b"]}}}, "", 0);
    check({i: {$not: {$in: ["g"]}}}, "a", 2);
    check({i: {$not: {$nin: ["a"]}}}, "a");
    check({i: {$not: /a/}}, "b");
    check({i: {$not: /(a|b)/}}, "", 0);
    check({i: {$not: /a/, $regex: "a"}}, "", 0);
    check({i: {$not: /aa/}}, "a", 2);
    fail({i: {$not: {$regex: "a"}}});
    fail({i: {$not: {$options: "a"}}});
    check({i: {$type: 2}}, "a", 2);
    check({i: {$not: {$type: 1}}}, "a", 2);
    check({i: {$not: {$type: 2}}}, "", 0);

    t.remove({});
    t.save({i: 1});
    check({i: {$not: {$mod: [5, 1]}}}, null, 0);
    check({i: {$mod: [5, 2]}}, null, 0);
    check({i: {$not: {$mod: [5, 2]}}}, 1, 1);

    t.remove({});
    t.save({i: ["a", "b"]});
    check({i: {$not: {$size: 2}}}, null, 0);
    check({i: {$not: {$size: 3}}}, ["a", "b"]);
    check({i: {$not: {$gt: "a"}}}, null, 0);
    check({i: {$not: {$gt: "c"}}}, ["a", "b"]);
    check({i: {$not: {$all: ["a", "b"]}}}, null, 0);
    check({i: {$not: {$all: ["c"]}}}, ["a", "b"]);

    t.remove({});
    t.save({i: [{j: "a"}]});
    t.save({i: [{j: "b"}]});
    check({i: {$not: {$elemMatch: {j: "a"}}}}, [{j: "b"}]);
    check({i: {$not: {$elemMatch: {j: "f"}}}}, [{j: "a"}], 2);

};

doTest();
t.ensureIndex({i: 1});
doTest();