// // 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();