/* sample aggregate command queries */ // make sure we're using the right db; this is the same as "use mydb;" in shell db = db.getSisterDB("aggdb"); // just passing through fields var p1 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { tags : 1, pageViews : 1 }} ]}); // unwinding an array var p2 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { author : 1, tag : { $unwind : "$tags" }, pageViews : 1 }} ]}); // pulling values out of subdocuments var p3 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { otherfoo : "$other.foo", otherbar : "$other.bar" }} ]}); // projection includes a computed value var p4 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { author : 1, daveWroteIt : { $eq:["$author", "dave"] } }} ]}); // projection includes a virtual (fabricated) document var p5 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { author : 1, pageViews : 1, tag : { $unwind : "$tags" } }}, { $project : { author : 1, subDocument : { foo : "$pageViews", bar : "$tag" } }} ]}); // multi-step aggregate // nested expressions in computed fields var p6 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { author : 1, tag : { $unwind : "$tags" }, pageViews : 1 }}, { $project : { author : 1, tag : 1, pageViews : 1, daveWroteIt : { $eq:["$author", "dave"] }, weLikeIt : { $or:[ { $eq:["$author", "dave"] }, { $eq:["$tag", "good"] } ] } }} ]}); // slightly more complex computed expression; $ifNull var p7 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { theSum : { $add:["$pageViews", { $ifNull:["$other.foo", "$other.bar"] } ] } }} ]}); // dotted path inclusion; _id exclusion var p8 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { _id : 0, author : 1, tag : { $unwind : "$tags" }, "comments.author" : 1 }} ]}); // simple matching var m1 = db.runCommand( { aggregate : "article", pipeline : [ { $match : { author : "dave" } } ]}); // combining matching with a projection var m2 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { title : 1, author : 1, pageViews : 1, tag : { $unwind : "$tags" }, comments : 1 }}, { $match : { tag : "nasty" } } ]}); // group by tag var g1 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { author : 1, tag : { $unwind : "$tags" }, pageViews : 1 }}, { $group : { _id: { tag : 1 }, docsByTag : { $sum : 1 }, viewsByTag : { $sum : "$pageViews" } }} ]}); // $max, and averaging in a final projection var g2 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { author : 1, tag : { $unwind : "$tags" }, pageViews : 1 }}, { $group : { _id: { tag : 1 }, docsByTag : { $sum : 1 }, viewsByTag : { $sum : "$pageViews" }, mostViewsByTag : { $max : "$pageViews" }, }}, { $project : { _id: false, tag : "$_id.tag", mostViewsByTag : 1, docsByTag : 1, viewsByTag : 1, avgByTag : { $divide:["$viewsByTag", "$docsByTag"] } }} ]}); // $addToSet as an accumulator; can pivot data var g3 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { author : 1, tag : { $unwind : "$tags" } }}, { $group : { _id : { tag : 1 }, authors : { $addToSet : "$author" } }} ]}); // $avg, and averaging in a final projection var g4 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { author : 1, tag : { $unwind : "$tags" }, pageViews : 1 }}, { $group : { _id: { tag : 1 }, docsByTag : { $sum : 1 }, viewsByTag : { $sum : "$pageViews" }, avgByTag : { $avg : "$pageViews" }, }} ]});