mongo-debian/jstests/aggregation/testall.js
2013-03-23 13:40:41 +01:00

1543 lines
30 KiB
JavaScript

/*
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"});
// 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);