Stages Cheatsheet

A simple example for each stage in the MongoDB Aggregation Framework.

Stages:

QueryMutateSummarise/ItemiseJoinOutput
$geoNear$addFields$bucket$graphLookup$merge
$limit$project$bucketAuto$lookup$out
$match$redact$count$unionWith
$sample$replaceRoot$facet
$skip$replaceWith$group
$sort$set$sortByCount
$setWindowFields$unwind
$unset

The following stages are not included because they are unrelated to aggregating business data or rely on external systems:  $collStats, $indexStats, $listSessions, $planCacheStats, $currentOp, $listLocalSessions, $search

Input Collections:

// shapes
{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}

// lists
{_id: "▤", a: "●", b: ["◰", "◱"]}
{_id: "▥", a: "▲", b: ["◲"]}
{_id: "▦", a: "▲", b: ["◰", "◳", "◱"]}
{_id: "▧", a: "●", b: ["◰"]}
{_id: "▨", a: "■", b: ["◳", "◱"]}

// places
{_id: "◧", loc: {type: "Point", coordinates: [1,1]}}
{_id: "◨", loc: {type: "Point", coordinates: [3,3]}}
{_id: "◩", loc: {type: "Point", coordinates: [5,5]}}
{_id: "◪", loc: {type: "LineString", coordinates: [[7,7],[8,8]]}}

 


$addFields

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$addFields: {z: "●"}      
   ⬇︎      
{_id: '◐', x: '■', y: '▲', val: 11, z: '●'}
{_id: '◑', x: '■', y: '■', val: 74, z: '●'}
{_id: '◒', x: '●', y: '■', val: 79, z: '●'}
{_id: '◓', x: '▲', y: '▲', val: 81, z: '●'}
{_id: '◔', x: '■', y: '▲', val: 83, z: '●'}
{_id: '◕', x: '●', y: '■', val: 85, z: '●'}

 


$bucket

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$bucket: {
  groupBy: "$val",
  boundaries: [0, 25, 50, 75, 100],
  default: "Other"
}
   ⬇︎      
{_id: 0, count: 1}
{_id: 50, count: 1}
{_id: 75, count: 4}    

 


$bucketAuto

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$bucketAuto: {groupBy: "$val", buckets: 3}
   ⬇︎      
{_id: {min: 11, max: 79}, count: 2}
{_id: {min: 79, max: 83}, count: 2}
{_id: {min: 83, max: 85}, count: 2}   

 


$count

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$count: "amount"
   ⬇︎      
{amount: 6}    

 


$facet

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$facet: {
  X_CIRCLE_FACET: [{$match: {x: "●"}}],
  FIRST_TWO_FACET: [{$limit: 2}]
}
   ⬇︎      
{
  X_CIRCLE_FACET: [
    {_id: '◒', x: '●', y: '■', val: 79},
    {_id: '◕', x: '●', y: '■', val: 85}
  ],
  FIRST_TWO_FACET: [
    {_id: '◐', x: '■', y: '▲', val: 11},
    {_id: '◑', x: '■', y: '■', val: 74}
  ]
}   

 


$geoNear

{_id: "◧", loc: {type: "Point", coordinates: [1,1]}}
{_id: "◨", loc: {type: "Point", coordinates: [3,3]}}
{_id: "◩", loc: {type: "Point", coordinates: [5,5]}}
{_id: "◪", loc: {type: "LineString", coordinates: [[7,7],[8,8]]}}
   ⬇︎      
$geoNear: {
  near: {type: "Point", coordinates: [9,9]}, 
  distanceField: "distance"
}
   ⬇︎      
{_id: '◪', loc: { type: 'LineString', coordinates: [[7,7], [8,8]]}
      distance: 156565.32902203742}
{_id: '◩', loc: { type: 'Point', coordinates: [5,5]}
      distance: 627304.9320885336}
{_id: '◨', loc: { type: 'Point', coordinates: [3,3]}
      distance: 941764.4675092621}
{_id: '◧', loc: { type: 'Point', coordinates: [1,1]}
      distance: 1256510.3666236876}   

 


$graphLookup

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$graphLookup: {
  from: "shapes",
  startWith: "$x",
  connectFromField: "x",
  connectToField: "y",
  depthField: "depth",
  as: "connections"
}
$project: {connections_count: {$size: "$connections"}}
   ⬇︎      
{_id: '◐', connections_count: 3}
{_id: '◑', connections_count: 3}
{_id: '◒', connections_count: 0}
{_id: '◓', connections_count: 6}
{_id: '◔', connections_count: 3}
{_id: '◕', connections_count: 0}

 


$group

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$group: {_id: "$x", ylist: {$push: "$y"}}
   ⬇︎   
{_id: '●', ylist: ['■', '■']}
{_id: '■', ylist: ['▲', '■', '▲']}
{_id: '▲', ylist: ['▲']}      

 


$limit

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$limit: 2
   ⬇︎      
{_id: '◐', x: '■', y: '▲', val: 11}
{_id: '◑', x: '■', y: '■', val: 74}   

 


$lookup

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ✚
{_id: "▤", a: "●", b: ["◰", "◱"]}
{_id: "▥", a: "▲", b: ["◲"]}
{_id: "▦", a: "▲", b: ["◰", "◳", "◱"]}
{_id: "▧", a: "●", b: ["◰"]}
{_id: "▨", a: "■", b: ["◳", "◱"]}
   ⬇︎      
$lookup: {
  from: "lists",
  localField: "y",
  foreignField: "a",
  as: "refs"
}
   ⬇︎         
{_id: '◐', x: '■', y: '▲', val: 11, refs: [
  {_id: '▥', a: '▲', b: ['◲']},
  {_id: '▦', a: '▲', b: ['◰', '◳', '◱']}
]}
{_id: '◑', x: '■', y: '■', val: 74, refs: [
  {_id: '▨', a: '■', b: ['◳', '◱']}
]}
{_id: '◒', x: '●', y: '■', val: 79, refs: [
  {_id: '▨', a: '■', b: ['◳', '◱']}
]}
{_id: '◓', x: '▲', y: '▲', val: 81, refs: [
  {_id: '▥', a: '▲', b: ['◲']},
  {_id: '▦', a: '▲', b: ['◰', '◳', '◱']}
]}
{_id: '◔', x: '■', y: '▲', val: 83, refs: [
  {_id: '▥', a: '▲', b: ['◲']},
  {_id: '▦', a: '▲', b: ['◰', '◳', '◱']}
]}
{_id: '◕', x: '●', y: '■', val: 85, refs: [
  {_id: '▨', a: '■', b: ['◳', '◱']}
]}   

 


$match

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$match: {y: "▲"}  
   ⬇︎      
{_id: '◐', x: '■', y: '▲', val: 11}
{_id: '◓', x: '▲', y: '▲', val: 81}
{_id: '◔', x: '■', y: '▲', val: 83}   

 


$merge

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$merge: {into: "results"}
   ⬇︎      
db.results.find()   
{_id: '◐', x: '■', y: '▲', val: 11}
{_id: '◑', x: '■', y: '■', val: 74}
{_id: '◒', x: '●', y: '■', val: 79}
{_id: '◓', x: '▲', y: '▲', val: 81}
{_id: '◔', x: '■', y: '▲', val: 83}
{_id: '◕', x: '●', y: '■', val: 85}   

 


$out

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$out: "results"
   ⬇︎      
db.results.find()   
{_id: '◐', x: '■', y: '▲', val: 11}
{_id: '◑', x: '■', y: '■', val: 74}
{_id: '◒', x: '●', y: '■', val: 79}
{_id: '◓', x: '▲', y: '▲', val: 81}
{_id: '◔', x: '■', y: '▲', val: 83}
{_id: '◕', x: '●', y: '■', val: 85}   

 


$project

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$project: {x: 1}
   ⬇︎      
{_id: '◐', x: '■'}
{_id: '◑', x: '■'}
{_id: '◒', x: '●'}
{_id: '◓', x: '▲'}
{_id: '◔', x: '■'}
{_id: '◕', x: '●'}   

 


$redact

{_id: "◧", loc: {type: "Point", coordinates: [1,1]}}
{_id: "◨", loc: {type: "Point", coordinates: [3,3]}}
{_id: "◩", loc: {type: "Point", coordinates: [5,5]}}
{_id: "◪", loc: {type: "LineString", coordinates: [[7,7],[8,8]]}}
   ⬇︎      
$redact: {$cond: {
  if  : {$eq: ["$type", "LineString"]},
  then: "$$PRUNE",
  else: "$$DESCEND"
}}
   ⬇︎      
{_id: '◧', loc: { type: 'Point', coordinates: [1,1]}}
{_id: '◨', loc: { type: 'Point', coordinates: [3,3]}}
{_id: '◩', loc: { type: 'Point', coordinates: [5,5]}}
{_id: '◪'}   

 


$replaceRoot

{_id: "▤", a: "●", b: ["◰", "◱"]}
{_id: "▥", a: "▲", b: ["◲"]}
{_id: "▦", a: "▲", b: ["◰", "◳", "◱"]}
{_id: "▧", a: "●", b: ["◰"]}
{_id: "▨", a: "■", b: ["◳", "◱"]}
   ⬇︎      
$replaceRoot: {
  newRoot: {first: {$first: "$b"}, last: {$last: "$b"}}
}
   ⬇︎      
{first: '◰', last: '◱'}
{first: '◲', last: '◲'}
{first: '◰', last: '◱'}
{first: '◰', last: '◰'}
{first: '◳', last: '◱'}

 


$replaceWith

{_id: "▤", a: "●", b: ["◰", "◱"]}
{_id: "▥", a: "▲", b: ["◲"]}
{_id: "▦", a: "▲", b: ["◰", "◳", "◱"]}
{_id: "▧", a: "●", b: ["◰"]}
{_id: "▨", a: "■", b: ["◳", "◱"]}
   ⬇︎      
$replaceWith: {
  first: {$first: "$b"}, last: {$last: "$b"}
}
   ⬇︎      
{first: '◰', last: '◱'}
{first: '◲', last: '◲'}
{first: '◰', last: '◱'}
{first: '◰', last: '◰'}
{first: '◳', last: '◱'}

 


$sample

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$sample: {size: 3}
   ⬇︎     
{_id: '◔', x: '■', y: '▲', val: 83}
{_id: '◓', x: '▲', y: '▲', val: 81}
{_id: '◑', x: '■', y: '■', val: 74}

 


$set

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$set: {y: "▲"}
   ⬇︎      
{_id: '◐', x: '■', y: '▲', val: 11}
{_id: '◑', x: '■', y: '▲', val: 74}
{_id: '◒', x: '●', y: '▲', val: 79}
{_id: '◓', x: '▲', y: '▲', val: 81}
{_id: '◔', x: '■', y: '▲', val: 83}
{_id: '◕', x: '●', y: '▲', val: 85}        

 


$setWindowFields

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$setWindowFields: {
  partitionBy: "$x",
  sortBy: {"_id": 1},    
  output: {
    cumulativeValShapeX: {
      $sum: "$val",
      window: {
        documents: ["unbounded", "current"]
      }
    }
 }
}
   ⬇︎      
{_id: '◐', x: '■', y: '▲', val: 11, cumulativeValShapeX: 11}
{_id: '◑', x: '■', y: '■', val: 74, cumulativeValShapeX: 85}
{_id: '◔', x: '■', y: '▲', val: 83, cumulativeValShapeX: 168}
{_id: '◓', x: '▲', y: '▲', val: 81, cumulativeValShapeX: 81}
{_id: '◒', x: '●', y: '■', val: 79, cumulativeValShapeX: 79}
{_id: '◕', x: '●', y: '■', val: 85, cumulativeValShapeX: 164}

 


$skip

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$skip: 5
   ⬇︎      
{_id: '◕', x: '●', y: '■', val: 85}

 


$sort

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$sort: {x: 1, y: 1}
   ⬇︎      
{_id: '◑', x: '■', y: '■', val: 74}
{_id: '◐', x: '■', y: '▲', val: 11}
{_id: '◔', x: '■', y: '▲', val: 83}
{_id: '◓', x: '▲', y: '▲', val: 81}
{_id: '◒', x: '●', y: '■', val: 79}
{_id: '◕', x: '●', y: '■', val: 85}   

 


$sortByCount

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$sortByCount: "$x"
   ⬇︎    
{_id: '■', count: 3}
{_id: '●', count: 2}
{_id: '▲', count: 1}     

 


$unionWith

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ✚
{_id: "▤", a: "●", b: ["◰", "◱"]}
{_id: "▥", a: "▲", b: ["◲"]}
{_id: "▦", a: "▲", b: ["◰", "◳", "◱"]}
{_id: "▧", a: "●", b: ["◰"]}
{_id: "▨", a: "■", b: ["◳", "◱"]}
   ⬇︎      
$unionWith: {coll: "lists"} 
   ⬇︎    
{_id: '◐', x: '■', y: '▲', val: 11}
{_id: '◑', x: '■', y: '■', val: 74}
{_id: '◒', x: '●', y: '■', val: 79}
{_id: '◓', x: '▲', y: '▲', val: 81}
{_id: '◔', x: '■', y: '▲', val: 83}
{_id: '◕', x: '●', y: '■', val: 85}
{_id: '▤', a: '●', b: ['◰', '◱']}
{_id: '▥', a: '▲', b: ['◲']}
{_id: '▦', a: '▲', b: ['◰', '◳', '◱']}
{_id: '▧', a: '●', b: ['◰']}
{_id: '▨', a: '■', b: ['◳', '◱']}     

 


$unset

{_id: "◐", x: "■", y: "▲", val: 11}
{_id: "◑", x: "■", y: "■", val: 74}
{_id: "◒", x: "●", y: "■", val: 79}
{_id: "◓", x: "▲", y: "▲", val: 81}
{_id: "◔", x: "■", y: "▲", val: 83}
{_id: "◕", x: "●", y: "■", val: 85}
   ⬇︎      
$unset: ["x"] 
   ⬇︎  
{_id: '◐', y: '▲', val: 11}
{_id: '◑', y: '■', val: 74}
{_id: '◒', y: '■', val: 79}
{_id: '◓', y: '▲', val: 81}
{_id: '◔', y: '▲', val: 83}
{_id: '◕', y: '■', val: 85}       

 


$unwind

{_id: "▤", a: "●", b: ["◰", "◱"]}
{_id: "▥", a: "▲", b: ["◲"]}
{_id: "▦", a: "▲", b: ["◰", "◳", "◱"]}
{_id: "▧", a: "●", b: ["◰"]}
{_id: "▨", a: "■", b: ["◳", "◱"]}
   ⬇︎      
$unwind: {path: "$b"}
   ⬇︎      
{_id: '▤', a: '●', b: '◰'}
{_id: '▤', a: '●', b: '◱'}
{_id: '▥', a: '▲', b: '◲'}
{_id: '▦', a: '▲', b: '◰'}
{_id: '▦', a: '▲', b: '◳'}
{_id: '▦', a: '▲', b: '◱'}
{_id: '▧', a: '●', b: '◰'}
{_id: '▨', a: '■', b: '◳'}
{_id: '▨', a: '■', b: '◱'}