summaryrefslogtreecommitdiff
path: root/jstests/sharding/empty_doc_results.js
blob: 6128bffd37b0e3972ecfba2d4f8b95e5930ccf72 (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
//
// Verifies that mongos correctly handles empty documents when all fields are projected out
//

var options = { mongosOptions : { binVersion : "" },
                shardOptions : { binVersion : "" } };

var st = new ShardingTest({ shards : 2, other : options });

var mongos = st.s0;
var coll = mongos.getCollection("foo.bar");
var admin = mongos.getDB("admin");
var shards = mongos.getDB("config").shards.find().toArray();

assert.commandWorked(admin.runCommand({ enableSharding : coll.getDB().getName() }));
printjson(admin.runCommand({ movePrimary : coll.getDB().getName(), to : shards[0]._id }));
assert.commandWorked(admin.runCommand({ shardCollection: coll.getFullName(),
                                        key: { _id : 1 } }));

assert.commandWorked(admin.runCommand({ split : coll.getFullName(), middle : { _id : 0 } }));
assert.commandWorked(admin.runCommand({ moveChunk : coll.getFullName(),
                                        find : { _id : 0 },
                                        to : shards[1]._id }));

st.printShardingStatus();

// Insert 100 documents, half of which have an extra field
for (var i = -50; i < 50; i++) {
    var doc = {};
    if (i >= 0)
        doc.positiveId = true;
    assert.writeOK(coll.insert(doc));
}

//
//
// Ensure projecting out all fields still returns the same number of documents
assert.eq(100, coll.find({}).itcount());
assert.eq(100, coll.find({}).sort({ positiveId : 1 }).itcount());
assert.eq(100, coll.find({}, { _id : 0, positiveId : 0 }).itcount());
// Can't remove sort key from projection (SERVER-11877) but some documents will still be empty
assert.eq(100, coll.find({}, { _id : 0 }).sort({ positiveId : 1 }).itcount());

//
//
// Ensure projecting out all fields still returns the same ordering of documents
var assertLast50Positive = function(sortedDocs) {
    assert.eq(100, sortedDocs.length);
    var positiveCount = 0;
    for (var i = 0; i < sortedDocs.length; ++i) {
        if (sortedDocs[i].positiveId) {
            positiveCount++;
        }
        else {
            // Make sure only the last set of documents have "positiveId" set
            assert.eq(positiveCount, 0);
        }
    }
    assert.eq(positiveCount, 50);
};

assertLast50Positive(coll.find({}).sort({ positiveId : 1 }).toArray());
assertLast50Positive(coll.find({}, { _id : 0 }).sort({ positiveId : 1 }).toArray());

jsTest.log("DONE!");
st.stop();