summaryrefslogtreecommitdiff
path: root/jstests/aggregation/testall.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/aggregation/testall.js')
-rw-r--r--jstests/aggregation/testall.js1576
1 files changed, 1576 insertions, 0 deletions
diff --git a/jstests/aggregation/testall.js b/jstests/aggregation/testall.js
new file mode 100644
index 00000000000..410e684ee1d
--- /dev/null
+++ b/jstests/aggregation/testall.js
@@ -0,0 +1,1576 @@
+/*
+ Run all the aggregation tests
+*/
+
+/* load the test documents */
+load('jstests/aggregation/data/articles.js');
+
+// make sure we're using the right db; this is the same as "use mydb;" in shell
+db = db.getSiblingDB("aggdb");
+
+
+// just passing through fields
+var p1 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ tags : 1,
+ pageViews : 1
+ }}
+]});
+
+var p1result = [
+ {
+ "_id" : 1,
+ "pageViews" : 5,
+ "tags" : [
+ "fun",
+ "good",
+ "fun"
+ ]
+ },
+ {
+ "_id" : 2,
+ "pageViews" : 7,
+ "tags" : [
+ "fun",
+ "nasty"
+ ]
+ },
+ {
+ "_id" : 3,
+ "pageViews" : 6,
+ "tags" : [
+ "nasty",
+ "filthy"
+ ]
+ }
+];
+
+assert.eq(p1.result, p1result, 'p1 failed');
+
+
+// a simple array unwinding
+var u1 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $unwind : "$tags" }
+]});
+
+var u1result = [
+ {
+ "_id" : 1,
+ "title" : "this is my title",
+ "author" : "bob",
+ "posted" : ISODate("2004-03-21T18:59:54Z"),
+ "pageViews" : 5,
+ "tags" : "fun",
+ "comments" : [
+ {
+ "author" : "joe",
+ "text" : "this is cool"
+ },
+ {
+ "author" : "sam",
+ "text" : "this is bad"
+ }
+ ],
+ "other" : {
+ "foo" : 5
+ }
+ },
+ {
+ "_id" : 1,
+ "title" : "this is my title",
+ "author" : "bob",
+ "posted" : ISODate("2004-03-21T18:59:54Z"),
+ "pageViews" : 5,
+ "tags" : "good",
+ "comments" : [
+ {
+ "author" : "joe",
+ "text" : "this is cool"
+ },
+ {
+ "author" : "sam",
+ "text" : "this is bad"
+ }
+ ],
+ "other" : {
+ "foo" : 5
+ }
+ },
+ {
+ "_id" : 1,
+ "title" : "this is my title",
+ "author" : "bob",
+ "posted" : ISODate("2004-03-21T18:59:54Z"),
+ "pageViews" : 5,
+ "tags" : "fun",
+ "comments" : [
+ {
+ "author" : "joe",
+ "text" : "this is cool"
+ },
+ {
+ "author" : "sam",
+ "text" : "this is bad"
+ }
+ ],
+ "other" : {
+ "foo" : 5
+ }
+ },
+ {
+ "_id" : 2,
+ "title" : "this is your title",
+ "author" : "dave",
+ "posted" : ISODate("2030-08-08T04:11:10Z"),
+ "pageViews" : 7,
+ "tags" : "fun",
+ "comments" : [
+ {
+ "author" : "barbara",
+ "text" : "this is interesting"
+ },
+ {
+ "author" : "jenny",
+ "text" : "i like to play pinball",
+ "votes" : 10
+ }
+ ],
+ "other" : {
+ "bar" : 14
+ }
+ },
+ {
+ "_id" : 2,
+ "title" : "this is your title",
+ "author" : "dave",
+ "posted" : ISODate("2030-08-08T04:11:10Z"),
+ "pageViews" : 7,
+ "tags" : "nasty",
+ "comments" : [
+ {
+ "author" : "barbara",
+ "text" : "this is interesting"
+ },
+ {
+ "author" : "jenny",
+ "text" : "i like to play pinball",
+ "votes" : 10
+ }
+ ],
+ "other" : {
+ "bar" : 14
+ }
+ },
+ {
+ "_id" : 3,
+ "title" : "this is some other title",
+ "author" : "jane",
+ "posted" : ISODate("2000-12-31T05:17:14Z"),
+ "pageViews" : 6,
+ "tags" : "nasty",
+ "comments" : [
+ {
+ "author" : "will",
+ "text" : "i don't like the color"
+ },
+ {
+ "author" : "jenny",
+ "text" : "can i get that in green?"
+ }
+ ],
+ "other" : {
+ "bar" : 14
+ }
+ },
+ {
+ "_id" : 3,
+ "title" : "this is some other title",
+ "author" : "jane",
+ "posted" : ISODate("2000-12-31T05:17:14Z"),
+ "pageViews" : 6,
+ "tags" : "filthy",
+ "comments" : [
+ {
+ "author" : "will",
+ "text" : "i don't like the color"
+ },
+ {
+ "author" : "jenny",
+ "text" : "can i get that in green?"
+ }
+ ],
+ "other" : {
+ "bar" : 14
+ }
+ }
+];
+
+assert.eq(u1.result, u1result, 'u1 failed');
+
+// unwind an array at the end of a dotted path
+db.ut.drop();
+db.ut.save({_id: 4, a:1, b:{e:7, f:[4, 3, 2, 1]}, c:12, d:17});
+var u2 = db.runCommand(
+{ aggregate : "ut", pipeline : [
+ { $unwind : "$b.f" }
+]});
+
+var u2result = [
+ {
+ "_id" : 4,
+ "a" : 1,
+ "b" : {
+ "e" : 7,
+ "f" : 4
+ },
+ "c" : 12,
+ "d" : 17
+ },
+ {
+ "_id" : 4,
+ "a" : 1,
+ "b" : {
+ "e" : 7,
+ "f" : 3
+ },
+ "c" : 12,
+ "d" : 17
+ },
+ {
+ "_id" : 4,
+ "a" : 1,
+ "b" : {
+ "e" : 7,
+ "f" : 2
+ },
+ "c" : 12,
+ "d" : 17
+ },
+ {
+ "_id" : 4,
+ "a" : 1,
+ "b" : {
+ "e" : 7,
+ "f" : 1
+ },
+ "c" : 12,
+ "d" : 17
+ }
+];
+
+assert.eq(u2.result, u2result, 'u2 failed');
+
+
+// combining a projection with unwinding an array
+var p2 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ author : 1,
+ tags : 1,
+ pageViews : 1
+ }},
+ { $unwind : "$tags" }
+]});
+
+var p2result = [
+ {
+ "_id" : 1,
+ "author" : "bob",
+ "pageViews" : 5,
+ "tags" : "fun"
+ },
+ {
+ "_id" : 1,
+ "author" : "bob",
+ "pageViews" : 5,
+ "tags" : "good"
+ },
+ {
+ "_id" : 1,
+ "author" : "bob",
+ "pageViews" : 5,
+ "tags" : "fun"
+ },
+ {
+ "_id" : 2,
+ "author" : "dave",
+ "pageViews" : 7,
+ "tags" : "fun"
+ },
+ {
+ "_id" : 2,
+ "author" : "dave",
+ "pageViews" : 7,
+ "tags" : "nasty"
+ },
+ {
+ "_id" : 3,
+ "author" : "jane",
+ "pageViews" : 6,
+ "tags" : "nasty"
+ },
+ {
+ "_id" : 3,
+ "author" : "jane",
+ "pageViews" : 6,
+ "tags" : "filthy"
+ }
+];
+
+assert.eq(p2.result, p2result, 'p2 failed');
+
+
+// pulling values out of subdocuments
+var p3 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ otherfoo : "$other.foo",
+ otherbar : "$other.bar"
+ }}
+]});
+
+var p3result = [
+ {
+ "_id" : 1,
+ "otherfoo" : 5
+ },
+ {
+ "_id" : 2,
+ "otherbar" : 14
+ },
+ {
+ "_id" : 3,
+ "otherbar" : 14
+ }
+];
+
+assert.eq(p3.result, p3result, 'p3 failed');
+
+
+// projection includes a computed value
+var p4 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ author : 1,
+ daveWroteIt : { $eq:["$author", "dave"] }
+ }}
+]});
+
+var p4result = [
+ {
+ "_id" : 1,
+ "author" : "bob",
+ "daveWroteIt" : false
+ },
+ {
+ "_id" : 2,
+ "author" : "dave",
+ "daveWroteIt" : true
+ },
+ {
+ "_id" : 3,
+ "author" : "jane",
+ "daveWroteIt" : false
+ }
+];
+
+assert.eq(p4.result, p4result, 'p4 failed');
+
+
+// projection includes a virtual (fabricated) document
+var p5 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ author : 1,
+ pageViews : 1,
+ tags : 1
+ }},
+ { $unwind : "$tags" },
+ { $project : {
+ author : 1,
+ subDocument : { foo : "$pageViews", bar : "$tags" }
+ }}
+]});
+
+var p5result = [
+ {
+ "_id" : 1,
+ "author" : "bob",
+ "subDocument" : {
+ "foo" : 5,
+ "bar" : "fun"
+ }
+ },
+ {
+ "_id" : 1,
+ "author" : "bob",
+ "subDocument" : {
+ "foo" : 5,
+ "bar" : "good"
+ }
+ },
+ {
+ "_id" : 1,
+ "author" : "bob",
+ "subDocument" : {
+ "foo" : 5,
+ "bar" : "fun"
+ }
+ },
+ {
+ "_id" : 2,
+ "author" : "dave",
+ "subDocument" : {
+ "foo" : 7,
+ "bar" : "fun"
+ }
+ },
+ {
+ "_id" : 2,
+ "author" : "dave",
+ "subDocument" : {
+ "foo" : 7,
+ "bar" : "nasty"
+ }
+ },
+ {
+ "_id" : 3,
+ "author" : "jane",
+ "subDocument" : {
+ "foo" : 6,
+ "bar" : "nasty"
+ }
+ },
+ {
+ "_id" : 3,
+ "author" : "jane",
+ "subDocument" : {
+ "foo" : 6,
+ "bar" : "filthy"
+ }
+ }
+];
+
+assert.eq(p5.result, p5result, 'p5 failed');
+
+
+// multi-step aggregate
+// nested expressions in computed fields
+var p6 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ author : 1,
+ tags : 1,
+ pageViews : 1
+ }},
+ { $unwind : "$tags" },
+ { $project : {
+ author : 1,
+ tag : "$tags",
+ pageViews : 1,
+ daveWroteIt : { $eq:["$author", "dave"] },
+ weLikeIt : { $or:[ { $eq:["$author", "dave"] },
+ { $eq:["$tags", "good"] } ] }
+ }}
+]});
+
+var p6result = [
+ {
+ "_id" : 1,
+ "author" : "bob",
+ "pageViews" : 5,
+ "tag" : "fun",
+ "daveWroteIt" : false,
+ "weLikeIt" : false
+ },
+ {
+ "_id" : 1,
+ "author" : "bob",
+ "pageViews" : 5,
+ "tag" : "good",
+ "daveWroteIt" : false,
+ "weLikeIt" : true
+ },
+ {
+ "_id" : 1,
+ "author" : "bob",
+ "pageViews" : 5,
+ "tag" : "fun",
+ "daveWroteIt" : false,
+ "weLikeIt" : false
+ },
+ {
+ "_id" : 2,
+ "author" : "dave",
+ "pageViews" : 7,
+ "tag" : "fun",
+ "daveWroteIt" : true,
+ "weLikeIt" : true
+ },
+ {
+ "_id" : 2,
+ "author" : "dave",
+ "pageViews" : 7,
+ "tag" : "nasty",
+ "daveWroteIt" : true,
+ "weLikeIt" : true
+ },
+ {
+ "_id" : 3,
+ "author" : "jane",
+ "pageViews" : 6,
+ "tag" : "nasty",
+ "daveWroteIt" : false,
+ "weLikeIt" : false
+ },
+ {
+ "_id" : 3,
+ "author" : "jane",
+ "pageViews" : 6,
+ "tag" : "filthy",
+ "daveWroteIt" : false,
+ "weLikeIt" : false
+ }
+];
+
+assert.eq(p6.result, p6result, 'p6 failed');
+
+
+// slightly more complex computed expression; $ifNull
+var p7 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ theSum : { $add:["$pageViews",
+ { $ifNull:["$other.foo",
+ "$other.bar"] } ] }
+ }}
+]});
+
+var p7result = [
+ {
+ "_id" : 1,
+ "theSum" : 10
+ },
+ {
+ "_id" : 2,
+ "theSum" : 21
+ },
+ {
+ "_id" : 3,
+ "theSum" : 20
+ }
+];
+
+assert.eq(p7.result, p7result, 'p7 failed');
+
+
+// dotted path inclusion; _id exclusion
+var p8 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ _id : 0,
+ author : 1,
+ tags : 1,
+ "comments.author" : 1
+ }},
+ { $unwind : "$tags" }
+]});
+
+var p8result = [
+ {
+ "author" : "bob",
+ "tags" : "fun",
+ "comments" : [
+ {
+ "author" : "joe"
+ },
+ {
+ "author" : "sam"
+ }
+ ]
+ },
+ {
+ "author" : "bob",
+ "tags" : "good",
+ "comments" : [
+ {
+ "author" : "joe"
+ },
+ {
+ "author" : "sam"
+ }
+ ]
+ },
+ {
+ "author" : "bob",
+ "tags" : "fun",
+ "comments" : [
+ {
+ "author" : "joe"
+ },
+ {
+ "author" : "sam"
+ }
+ ]
+ },
+ {
+ "author" : "dave",
+ "tags" : "fun",
+ "comments" : [
+ {
+ "author" : "barbara"
+ },
+ {
+ "author" : "jenny"
+ }
+ ]
+ },
+ {
+ "author" : "dave",
+ "tags" : "nasty",
+ "comments" : [
+ {
+ "author" : "barbara"
+ },
+ {
+ "author" : "jenny"
+ }
+ ]
+ },
+ {
+ "author" : "jane",
+ "tags" : "nasty",
+ "comments" : [
+ {
+ "author" : "will"
+ },
+ {
+ "author" : "jenny"
+ }
+ ]
+ },
+ {
+ "author" : "jane",
+ "tags" : "filthy",
+ "comments" : [
+ {
+ "author" : "will"
+ },
+ {
+ "author" : "jenny"
+ }
+ ]
+ }
+];
+
+assert.eq(p8.result, p8result, 'p8 failed');
+
+
+// collapse a dotted path with an intervening array
+var p9 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ _id : 0,
+ author : 1,
+ commentsAuthor : "$comments.author"
+ }}
+]});
+
+var p9result = [
+ {
+ "author" : "bob",
+ "commentsAuthor" : [
+ "joe",
+ "sam"
+ ]
+ },
+ {
+ "author" : "dave",
+ "commentsAuthor" : [
+ "barbara",
+ "jenny"
+ ]
+ },
+ {
+ "author" : "jane",
+ "commentsAuthor" : [
+ "will",
+ "jenny"
+ ]
+ }
+];
+
+assert.eq(p9.result, p9result, 'p9 failed');
+
+
+// simple sort
+var p10 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $sort : { title : 1 }
+ }
+]});
+
+var p10result = [
+ {
+ "_id" : 1,
+ "title" : "this is my title",
+ "author" : "bob",
+ "posted" : ISODate("2004-03-21T18:59:54Z"),
+ "pageViews" : 5,
+ "tags" : [
+ "fun",
+ "good",
+ "fun"
+ ],
+ "comments" : [
+ {
+ "author" : "joe",
+ "text" : "this is cool"
+ },
+ {
+ "author" : "sam",
+ "text" : "this is bad"
+ }
+ ],
+ "other" : {
+ "foo" : 5
+ }
+ },
+ {
+ "_id" : 3,
+ "title" : "this is some other title",
+ "author" : "jane",
+ "posted" : ISODate("2000-12-31T05:17:14Z"),
+ "pageViews" : 6,
+ "tags" : [
+ "nasty",
+ "filthy"
+ ],
+ "comments" : [
+ {
+ "author" : "will",
+ "text" : "i don't like the color"
+ },
+ {
+ "author" : "jenny",
+ "text" : "can i get that in green?"
+ }
+ ],
+ "other" : {
+ "bar" : 14
+ }
+ },
+ {
+ "_id" : 2,
+ "title" : "this is your title",
+ "author" : "dave",
+ "posted" : ISODate("2030-08-08T04:11:10Z"),
+ "pageViews" : 7,
+ "tags" : [
+ "fun",
+ "nasty"
+ ],
+ "comments" : [
+ {
+ "author" : "barbara",
+ "text" : "this is interesting"
+ },
+ {
+ "author" : "jenny",
+ "text" : "i like to play pinball",
+ "votes" : 10
+ }
+ ],
+ "other" : {
+ "bar" : 14
+ }
+ }
+];
+
+assert.eq(p10.result, p10result, 'p10 failed');
+
+
+// unwind on nested array
+db.p11.drop();
+db.p11.save( {
+ _id : 5,
+ name : 'MongoDB',
+ items : {
+ authors : ['jay', 'vivek', 'bjornar'],
+ dbg : [17, 42]
+ },
+ favorites : ['pickles', 'ice cream', 'kettle chips']
+});
+
+var p11 = db.runCommand(
+{ aggregate : "p11", pipeline : [
+ { $unwind : "$items.authors" },
+ { $project : {
+ name : 1,
+ author : "$items.authors"
+ }},
+]});
+
+p11result = [
+ {
+ "_id" : 5,
+ "name" : "MongoDB",
+ "author" : "jay"
+ },
+ {
+ "_id" : 5,
+ "name" : "MongoDB",
+ "author" : "vivek"
+ },
+ {
+ "_id" : 5,
+ "name" : "MongoDB",
+ "author" : "bjornar"
+ }
+];
+
+assert.eq(p11.result, p11result, 'p11 failed');
+
+
+// multiply test
+var p12 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ theProduct : { $multiply:["$pageViews",
+ { $ifNull:["$other.foo",
+ "$other.bar"] } ] }
+ }}
+]});
+
+var p12result = [
+ {
+ "_id" : 1,
+ "theProduct" : 25
+ },
+ {
+ "_id" : 2,
+ "theProduct" : 98
+ },
+ {
+ "_id" : 3,
+ "theProduct" : 84
+ }
+];
+
+assert.eq(p12.result, p12result, 'p12 failed');
+
+
+// subtraction test
+var p13 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ theDifference : { $subtract:["$pageViews",
+ { $ifNull:["$other.foo",
+ "$other.bar"] } ] }
+ }}
+]});
+
+var p13result = [
+ {
+ "_id" : 1,
+ "theDifference" : 0
+ },
+ {
+ "_id" : 2,
+ "theDifference" : -7
+ },
+ {
+ "_id" : 3,
+ "theDifference" : -8
+ }
+];
+
+assert.eq(p13.result, p13result, 'p13 failed');
+
+
+// mod test
+var p14 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ theRemainder : { $mod:[
+ { $ifNull:["$other.foo",
+ "$other.bar"] },
+ "$pageViews", ] }
+ }}
+]});
+
+var p14result = [
+ {
+ "_id" : 1,
+ "theRemainder" : 0
+ },
+ {
+ "_id" : 2,
+ "theRemainder" : 0
+ },
+ {
+ "_id" : 3,
+ "theRemainder" : 2
+ }
+];
+
+assert.eq(p14.result, p14result, 'p14 failed');
+
+
+// toUpper test
+var p15 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ author : {$toUpper: "$author"},
+ pageViews : 1
+ }}
+]});
+
+var p15result = [
+ {
+ "_id" : 1,
+ "author" : "BOB",
+ "pageViews" : 5
+ },
+ {
+ "_id" : 2,
+ "author" : "DAVE",
+ "pageViews" : 7
+ },
+ {
+ "_id" : 3,
+ "author" : "JANE",
+ "pageViews" : 6
+ }
+];
+
+assert.eq(p15.result, p15result, 'p15 failed');
+
+
+// toLower test
+var p16 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ author : {$toUpper: "$author"},
+ pageViews : 1
+ }},
+ { $project : {
+ author : {$toLower: "$author"},
+ pageViews : 1
+ }}
+]});
+
+var p16result = [
+ {
+ "_id" : 1,
+ "author" : "bob",
+ "pageViews" : 5,
+ },
+ {
+ "_id" : 2,
+ "author" : "dave",
+ "pageViews" : 7,
+ },
+ {
+ "_id" : 3,
+ "author" : "jane",
+ "pageViews" : 6,
+ }
+];
+
+assert.eq(p16.result, p16result, 'p16 failed');
+
+
+// substr test
+var p17 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ author : {$substr: ["$author", 1, 2]},
+ }}
+]});
+
+var p17result = [
+ {
+ "_id" : 1,
+ "author" : "ob"
+ },
+ {
+ "_id" : 2,
+ "author" : "av"
+ },
+ {
+ "_id" : 3,
+ "author" : "an"
+ }
+];
+
+assert.eq(p17.result, p17result, 'p17 failed');
+
+
+// strcasecmp test
+var p18 = db.runCommand(
+{aggregate : "article", pipeline : [
+ { $project : {
+ tags : 1,
+ thisisalametest : {$strcasecmp: ["foo","bar"]},
+ thisisalamepass : {$strcasecmp: ["foo","foo"]}
+ }}
+]});
+
+var p18result = [
+ {
+ "_id" : 1,
+ "tags" : [
+ "fun",
+ "good",
+ "fun"
+ ],
+ "thisisalametest" : 1,
+ "thisisalamepass" : 0
+ },
+ {
+ "_id" : 2,
+ "tags" : [
+ "fun",
+ "nasty"
+ ],
+ "thisisalametest" : 1,
+ "thisisalamepass" : 0
+ },
+ {
+ "_id" : 3,
+ "tags" : [
+ "nasty",
+ "filthy"
+ ],
+ "thisisalametest" : 1,
+ "thisisalamepass" : 0
+ }
+];
+
+assert.eq(p18.result, p18result, 'p18 failed');
+
+
+// date tests
+var p19 = db.runCommand({aggregate : "article", pipeline : [
+ { $project : {
+ authors: 1,
+ posted: 1,
+ seconds: {$second: "$posted"},
+ minutes: {$minute: "$posted"},
+ hour: {$hour: "$posted"},
+ dayOfYear: {$dayOfYear: "$posted"},
+ dayOfMonth: {$dayOfMonth: "$posted"},
+ dayOfWeek: {$dayOfWeek: "$posted"},
+ month: {$month: "$posted"},
+ week: {$week: "$posted"},
+ year: {$year: "$posted"}
+ }}
+]});
+
+var p19result = [
+ {
+ "_id" : 1,
+ "posted" : ISODate("2004-03-21T18:59:54Z"),
+ "seconds" : 54,
+ "minutes" : 59,
+ "hour" : 18,
+ "dayOfYear" : 81,
+ "dayOfMonth" : 21,
+ "dayOfWeek" : 1,
+ "month" : 3,
+ "week" : 12,
+ "year" : 2004,
+ },
+ {
+ "_id" : 2,
+ "posted" : ISODate("2030-08-08T04:11:10Z"),
+ "seconds" : 10,
+ "minutes" : 11,
+ "hour" : 4,
+ "dayOfYear" : 220,
+ "dayOfMonth" : 8,
+ "dayOfWeek" : 5,
+ "month" : 8,
+ "week" : 31,
+ "year" : 2030,
+ },
+ {
+ "_id" : 3,
+ "posted" : ISODate("2000-12-31T05:17:14Z"),
+ "seconds" : 14,
+ "minutes" : 17,
+ "hour" : 5,
+ "dayOfYear" : 366,
+ "dayOfMonth" : 31,
+ "dayOfWeek" : 1,
+ "month" : 12,
+ "week" : 53,
+ "year" : 2000,
+ }
+];
+
+assert.eq(p19.result, p19result, 'p19 failed');
+
+
+db.vartype.drop();
+db.vartype.save({ x : 17, y : "foo"});
+
+// just passing through fields
+var p20 = db.runCommand(
+{ aggregate : "vartype", pipeline : [
+ { $project : {
+ all_numbers : { $add:[1, "$x", 2, "$x"] },
+ string_fields : { $add:[3, "$y", 4, "$y"] },
+ number_fields : { $add:["a", "$x", "b", "$x"] },
+ all_strings : { $add:["c", "$y", "d", "$y"] },
+ potpourri_1 : { $add:[5, "$y", "e", "$x"] },
+ potpourri_2 : { $add:[6, "$x", "f", "$y"] },
+ potpourri_3 : { $add:["g", "$y", 7, "$x"] },
+ potpourri_4 : { $add:["h", "$x", 8, "$y"] },
+ _id: 0
+ }}
+]});
+
+var p20result = [
+ {
+ "all_numbers" : 37,
+ "string_fields" : "3foo4foo",
+ "number_fields" : "a17b17",
+ "all_strings" : "cfoodfoo",
+ "potpourri_1" : "5fooe17",
+ "potpourri_2" : "617ffoo",
+ "potpourri_3" : "gfoo717",
+ "potpourri_4" : "h178foo"
+ }
+];
+
+/* rework to use $concat after SERVER-6195
+assert.eq(p20.result, p20result, 'p20 failed');
+*/
+
+// ternary conditional operator
+var p21 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ _id : 0,
+ author : 1,
+ pageViews : { $cond : [ {$eq:["$author", "dave"]},
+ {$add:["$pageViews", 1000]}, "$pageViews" ]
+ }
+ }}
+]});
+
+var p21result = [
+ {
+ "author" : "bob",
+ "pageViews" : 5
+ },
+ {
+ "author" : "dave",
+ "pageViews" : 1007
+ },
+ {
+ "author" : "jane",
+ "pageViews" : 6
+ }
+];
+
+assert.eq(p21.result, p21result, 'p21 failed');
+
+
+// simple matching
+var m1 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $match : { author : "dave" } }
+]});
+
+var m1result = [
+ {
+ "_id" : 2,
+ "title" : "this is your title",
+ "author" : "dave",
+ "posted" : ISODate("2030-08-08T04:11:10Z"),
+ "pageViews" : 7,
+ "tags" : [
+ "fun",
+ "nasty"
+ ],
+ "comments" : [
+ {
+ "author" : "barbara",
+ "text" : "this is interesting"
+ },
+ {
+ "author" : "jenny",
+ "text" : "i like to play pinball",
+ "votes" : 10
+ }
+ ],
+ "other" : {
+ "bar" : 14
+ }
+ }
+];
+
+assert.eq(m1.result, m1result, 'm1 failed');
+
+
+// combining matching with a projection
+var m2 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ title : 1,
+ author : 1,
+ pageViews : 1,
+ tags : 1,
+ comments : 1
+ }},
+ { $unwind : "$tags" },
+ { $match : { tags : "nasty" } }
+]});
+
+var m2result = [
+ {
+ "_id" : 2,
+ "title" : "this is your title",
+ "author" : "dave",
+ "pageViews" : 7,
+ "tags" : "nasty",
+ "comments" : [
+ {
+ "author" : "barbara",
+ "text" : "this is interesting"
+ },
+ {
+ "author" : "jenny",
+ "text" : "i like to play pinball",
+ "votes" : 10
+ }
+ ]
+ },
+ {
+ "_id" : 3,
+ "title" : "this is some other title",
+ "author" : "jane",
+ "pageViews" : 6,
+ "tags" : "nasty",
+ "comments" : [
+ {
+ "author" : "will",
+ "text" : "i don't like the color"
+ },
+ {
+ "author" : "jenny",
+ "text" : "can i get that in green?"
+ }
+ ]
+ }
+];
+
+assert.eq(m2.result, m2result, 'm2 failed');
+
+
+// group by tag, _id is a field reference
+var g1 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ author : 1,
+ tags : 1,
+ pageViews : 1
+ }},
+ { $unwind : "$tags" },
+ { $group : {
+ _id : "$tags",
+ docsByTag : { $sum : 1 },
+ viewsByTag : { $sum : "$pageViews" }
+ }},
+ {$sort: {'_id': 1}}
+]});
+
+var g1result = [
+ {
+ "_id" : "filthy",
+ "docsByTag" : 1,
+ "viewsByTag" : 6
+ },
+ {
+ "_id" : "fun",
+ "docsByTag" : 3,
+ "viewsByTag" : 17
+ },
+ {
+ "_id" : "good",
+ "docsByTag" : 1,
+ "viewsByTag" : 5
+ },
+ {
+ "_id" : "nasty",
+ "docsByTag" : 2,
+ "viewsByTag" : 13
+ },
+];
+
+assert.eq(g1.result, g1result, 'g1 failed');
+
+
+// $max, and averaging in a final projection; _id is structured
+var g2 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ author : 1,
+ tags : 1,
+ pageViews : 1
+ }},
+ { $unwind : "$tags" },
+ { $group : {
+ _id: { tags : "$tags" },
+ docsByTag : { $sum : 1 },
+ viewsByTag : { $sum : "$pageViews" },
+ mostViewsByTag : { $max : "$pageViews" },
+ }},
+ { $project : {
+ _id: false,
+ tag : "$_id.tags",
+ mostViewsByTag : 1,
+ docsByTag : 1,
+ viewsByTag : 1,
+ avgByTag : { $divide:["$viewsByTag", "$docsByTag"] }
+ }},
+ {$sort: {'docsByTag': 1, 'viewsByTag': 1}}
+]});
+
+var g2result = [
+ {
+ "docsByTag" : 1,
+ "viewsByTag" : 5,
+ "mostViewsByTag" : 5,
+ "tag" : "good",
+ "avgByTag" : 5
+ },
+ {
+ "docsByTag" : 1,
+ "viewsByTag" : 6,
+ "mostViewsByTag" : 6,
+ "tag" : "filthy",
+ "avgByTag" : 6
+ },
+ {
+ "docsByTag" : 2,
+ "viewsByTag" : 13,
+ "mostViewsByTag" : 7,
+ "tag" : "nasty",
+ "avgByTag" : 6.5
+ },
+ {
+ "docsByTag" : 3,
+ "viewsByTag" : 17,
+ "mostViewsByTag" : 7,
+ "tag" : "fun",
+ "avgByTag" : 5.666666666666667
+ }
+];
+
+assert.eq(g2.result, g2result, 'g2 failed');
+
+
+// $push as an accumulator; can pivot data
+var g3 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ author : 1,
+ tags : 1,
+ }},
+ { $unwind : "$tags" },
+ { $group : {
+ _id : { tags : "$tags" },
+ authors : { $push : "$author" }
+ }},
+ {$sort: {'_id': 1}}
+]});
+
+var g3result = [
+ {
+ "_id" : {
+ "tags" : "filthy"
+ },
+ "authors" : [
+ "jane"
+ ]
+ },
+ {
+ "_id" : {
+ "tags" : "fun"
+ },
+ "authors" : [
+ "bob",
+ "bob",
+ "dave"
+ ]
+ },
+ {
+ "_id" : {
+ "tags" : "good"
+ },
+ "authors" : [
+ "bob"
+ ]
+ },
+ {
+ "_id" : {
+ "tags" : "nasty"
+ },
+ "authors" : [
+ "dave",
+ "jane"
+ ]
+ }
+];
+
+assert.eq(g3.result, g3result, 'g3 failed');
+
+
+// $avg, and averaging in a final projection
+var g4 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ author : 1,
+ tags : 1,
+ pageViews : 1
+ }},
+ { $unwind : "$tags" },
+ { $group : {
+ _id: { tags : "$tags" },
+ docsByTag : { $sum : 1 },
+ viewsByTag : { $sum : "$pageViews" },
+ avgByTag : { $avg : "$pageViews" },
+ }},
+ {$sort: {'_id': 1}}
+]});
+
+var g4result = [
+ {
+ "_id" : {
+ "tags" : "filthy"
+ },
+ "docsByTag" : 1,
+ "viewsByTag" : 6,
+ "avgByTag" : 6
+ },
+ {
+ "_id" : {
+ "tags" : "fun"
+ },
+ "docsByTag" : 3,
+ "viewsByTag" : 17,
+ "avgByTag" : 5.666666666666667
+ },
+ {
+ "_id" : {
+ "tags" : "good"
+ },
+ "docsByTag" : 1,
+ "viewsByTag" : 5,
+ "avgByTag" : 5
+ },
+ {
+ "_id" : {
+ "tags" : "nasty"
+ },
+ "docsByTag" : 2,
+ "viewsByTag" : 13,
+ "avgByTag" : 6.5
+ }
+];
+
+assert.eq(g4.result, g4result, 'g4 failed');
+
+
+// $addToSet as an accumulator; can pivot data
+var g5 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $project : {
+ author : 1,
+ tags : 1,
+ }},
+ { $unwind : "$tags" },
+ { $group : {
+ _id : { tags : "$tags" },
+ authors : { $addToSet : "$author" }
+ }},
+ {$sort: {'_id': 1}}
+]});
+
+var g5result = [
+ {
+ "_id" : {
+ "tags" : "filthy"
+ },
+ "authors" : [
+ "jane"
+ ]
+ },
+ {
+ "_id" : {
+ "tags" : "fun"
+ },
+ "authors" : [
+ "dave",
+ "bob"
+ ]
+ },
+ {
+ "_id" : {
+ "tags" : "good"
+ },
+ "authors" : [
+ "bob"
+ ]
+ },
+ {
+ "_id" : {
+ "tags" : "nasty"
+ },
+ "authors" : [
+ "jane",
+ "dave"
+ ]
+ }
+];
+
+assert.eq(g5.result, g5result, 'g5 failed');
+
+
+// $first and $last accumulators, constant _id
+var g6 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $sort : { author : -1 } },
+ { $group : {
+ _id : "authors", /* constant string, *not* a field reference */
+ firstAuthor : { $last : "$author" }, /* note reverse sort above */
+ lastAuthor : { $first : "$author" }, /* note reverse sort above */
+ count : { $sum : 1 }
+ }}
+]});
+
+var g6result = [
+ {
+ "_id" : "authors",
+ firstAuthor : "bob",
+ lastAuthor : "jane",
+ count : 3
+ }
+];
+
+// Test unwind on an unused field
+var g7 = db.runCommand(
+{ aggregate : "article", pipeline : [
+ { $unwind : '$tags' },
+ { $group : {
+ _id : "tag_count", /* constant string, *not* a field reference */
+ count : { $sum : 1 }
+ }}
+]});
+assert.eq(g7.result[0].count, 7);