summaryrefslogtreecommitdiff
path: root/jstests/aggregation/testshard1.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/aggregation/testshard1.js')
-rw-r--r--jstests/aggregation/testshard1.js135
1 files changed, 135 insertions, 0 deletions
diff --git a/jstests/aggregation/testshard1.js b/jstests/aggregation/testshard1.js
new file mode 100644
index 00000000000..3bd0ff5f1bf
--- /dev/null
+++ b/jstests/aggregation/testshard1.js
@@ -0,0 +1,135 @@
+/*
+> ShardingTest
+function (testName, numShards, verboseLevel, numMongos, otherParams) {
+*/
+var shardedAggTest = new ShardingTest({
+ shards: 2,
+ verbose: 1,
+ mongos: 1,
+ other: { chunksize: 1}
+ }
+);
+
+shardedAggTest.adminCommand( { enablesharding : "aggShard" } );
+db = shardedAggTest.getDB( "aggShard" );
+
+/* make sure its cleaned up */
+db.ts1.drop();
+
+shardedAggTest.adminCommand( { shardcollection : "aggShard.ts1", key : { "_id" : 1 } } );
+
+
+/*
+Test combining results in mongos for operations that sub-aggregate on shards.
+
+The unusual operators here are $avg, $pushToSet, $push. In the case of $avg,
+the shard pipeline produces an object with the current subtotal and item count
+so that these can be combined in mongos by totalling the subtotals counts
+before performing the final division. For $pushToSet and $push, the shard
+pipelines produce arrays, but in mongos these are combined rather than simply
+being added as arrays within arrays.
+*/
+
+var count = 0;
+var strings = [
+ "one",
+ "two",
+ "three",
+ "four",
+ "five",
+ "six",
+ "seven",
+ "eight",
+ "nine",
+ "ten",
+ "eleven",
+ "twelve",
+ "thirteen",
+ "fourteen",
+ "fifteen",
+ "sixteen",
+ "seventeen",
+ "eighteen",
+ "nineteen",
+ "twenty"
+];
+
+var nItems = 200000;
+for(i = 1; i <= nItems; ++i) {
+ db.ts1.save(
+ {counter: ++count, number: strings[i % 20],
+ filler: "0123456789012345678901234567890123456789"});
+}
+
+// wait for all writebacks to be applied
+assert.eq(db.getLastError(), null);
+
+// a project and group in shards, result combined in mongos
+var a1 = db.runCommand({ aggregate:"ts1", pipeline:[
+ { $project: {
+ cMod10: {$mod:["$counter", 10]},
+ number: 1,
+ counter: 1
+ }},
+ { $group: {
+ _id: "$cMod10",
+ numberSet: {$addToSet: "$number"},
+ avgCounter: {$avg: "$cMod10"}
+ }},
+ { $sort: {_id:1} }
+]});
+
+var a1result = a1.result;
+for(i = 0 ; i < 10; ++i) {
+ assert.eq(a1result[i].avgCounter, a1result[i]._id,
+ 'agg sharded test avgCounter failed');
+ assert.eq(a1result[i].numberSet.length, 2,
+ 'agg sharded test numberSet length failed');
+}
+
+// an initial group starts the group in the shards, and combines them in mongos
+var a2 = db.runCommand({ aggregate:"ts1", pipeline:[
+ { $group: {
+ _id: "all",
+ total: {$sum: "$counter"}
+ }}
+]});
+
+// sum of an arithmetic progression S(n) = (n/2)(a(1) + a(n));
+assert.eq(a2.result[0].total, (nItems/2)*(1 + nItems),
+ 'agg sharded test counter sum failed');
+
+// an initial group starts the group in the shards, and combines them in mongos
+var a3 = db.runCommand({ aggregate:"ts1", pipeline:[
+ { $group: {
+ _id: "$number",
+ total: {$sum: 1}
+ }},
+ { $sort: {_id:1} }
+]});
+
+var a3result = a3.result;
+for(i = 0 ; i < strings.length; ++i) {
+ assert.eq(a3result[i].total, nItems/strings.length,
+ 'agg sharded test sum numbers failed');
+}
+
+// a match takes place in the shards; just returning the results from mongos
+var a4 = db.runCommand({ aggregate:"ts1", pipeline:[
+ { $match: {$or:[{counter:55}, {counter:1111},
+ {counter: 2222}, {counter: 33333},
+ {counter: 99999}, {counter: 55555}]}
+ }
+]});
+
+var a4result = a4.result;
+for(i = 0; i < 6; ++i) {
+ c = a4result[i].counter;
+ printjson({c:c})
+ assert((c == 55) || (c == 1111) || (c == 2222) ||
+ (c == 33333) || (c = 99999) || (c == 55555),
+ 'agg sharded test simple match failed');
+}
+
+// shut everything down
+shardedAggTest.stop();