summaryrefslogtreecommitdiff
path: root/jstests/core/nin.js
blob: d6cd78ee7a4d3a81af704dcc50a187ed1d542bee (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
t = db.jstests_nin;
t.drop();

function checkEqual(name, key, value) {
    var o = {};
    o[key] = {
        $in: [value]
    };
    var i = t.find(o).count();
    o[key] = {
        $nin: [value]
    };
    var n = t.find(o).count();

    assert.eq(t.find().count(),
              i + n,
              "checkEqual " + name + " $in + $nin != total | " + i + " + " + n + " != " +
                  t.find().count());
}

doTest = function(n) {

    t.save({a: [1, 2, 3]});
    t.save({a: [1, 2, 4]});
    t.save({a: [1, 8, 5]});
    t.save({a: [1, 8, 6]});
    t.save({a: [1, 9, 7]});

    assert.eq(5, t.find({a: {$nin: [10]}}).count(), n + " A");
    assert.eq(0, t.find({a: {$ne: 1}}).count(), n + " B");
    assert.eq(0, t.find({a: {$nin: [1]}}).count(), n + " C");
    assert.eq(0, t.find({a: {$nin: [1, 2]}}).count(), n + " D");
    assert.eq(3, t.find({a: {$nin: [2]}}).count(), n + " E");
    assert.eq(3, t.find({a: {$nin: [8]}}).count(), n + " F");
    assert.eq(4, t.find({a: {$nin: [9]}}).count(), n + " G");
    assert.eq(4, t.find({a: {$nin: [3]}}).count(), n + " H");
    assert.eq(3, t.find({a: {$nin: [2, 3]}}).count(), n + " I");
    assert.eq(1, t.find({a: {$ne: 8, $nin: [2, 3]}}).count(), n + " I2");

    checkEqual(n + " A", "a", 5);

    t.save({a: [2, 2]});
    assert.eq(3, t.find({a: {$nin: [2, 2]}}).count(), n + " J");

    t.save({a: [[2]]});
    assert.eq(4, t.find({a: {$nin: [2]}}).count(), n + " K");

    t.save({a: [{b: [10, 11]}, 11]});
    checkEqual(n + " B", "a", 5);
    checkEqual(n + " C", "a.b", 5);

    assert.eq(7, t.find({'a.b': {$nin: [10]}}).count(), n + " L");
    assert.eq(7, t.find({'a.b': {$nin: [[10, 11]]}}).count(), n + " M");
    assert.eq(7, t.find({a: {$nin: [11]}}).count(), n + " N");

    t.save({a: {b: [20, 30]}});
    assert.eq(1, t.find({'a.b': {$all: [20]}}).count(), n + " O");
    assert.eq(1, t.find({'a.b': {$all: [20, 30]}}).count(), n + " P");
};

doTest("no index");
t.drop();
t.ensureIndex({a: 1});
doTest("with index");