Advanced MongoDB Aggregation Pipelines Tom Schreiber
{ "About me" : { "Name" : "Tom Schreiber", "Title" : "Senior Consulting Engineer", "Email" : "tom.schreiber@mongodb.com", "Twitter" : "@SchreiberTom1", "Location" : "London, UK" } }
"Data should be easy to work with." "The data should serve you. You should not serve the data." "The same (data-) model in your head, in your code, and in your data - NO impedance mismatch." Eliot Horowitz CTO & Co-Founder of MongoDB MongoDB World’16
MongoDB Aggregation Framework "Data should be easy to work with." "The data should serve you. You should not serve the data." "The same (data-) model in your head, in your code, and in your data - NO impedance mismatch."
A Highly Composable Compute Pipeline MongoDB Aggregation Framework $sum$match
A Highly Composable Compute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match
A Highly Composable Compute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match
A Highly Composable Compute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match Notions of computation and monads Eugenio Moggi∗ Abstract The λ-calculus is considered an useful mathematical tool in the study of programming languages, since programs can be identified with λ-terms. However, if one goes further and uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced (programs are identified with total functions from values to values), that may jeopardise the applicability of theoretical results. In this paper we introduce calculi based on a categorical semantics for computations, that provide a correct basis for proving equivalence of programs, for a wide range of notions of computation.
A Highly Composable Compute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match Notions of computation and monads Eugenio Moggi∗ Abstract The λ-calculus is considered an useful mathematical tool in the study of programming languages, since programs can be identified with λ-terms. However, if one goes further and uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced (programs are identified with total functions from values to values), that may jeopardise the applicability of theoretical results. In this paper we introduce calculi based on a categorical semantics for computations, that provide a correct basis for proving equivalence of programs, for a wide range of notions of computation. A monad defines what it means to chain operations together. 
 This allows the programmer to build pipelines that process data in a series of steps […]
 Monads allow a programming style where programs are written by putting together highly composable parts […]
A Highly Composable Compute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match Notions of computation and monads Eugenio Moggi∗ Abstract The λ-calculus is considered an useful mathematical tool in the study of programming languages, since programs can be identified with λ-terms. However, if one goes further and uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced (programs are identified with total functions from values to values), that may jeopardise the applicability of theoretical results. In this paper we introduce calculi based on a categorical semantics for computations, that provide a correct basis for proving equivalence of programs, for a wide range of notions of computation. A monad defines what it means to chain operations together. 
 This allows the programmer to build pipelines that process data in a series of steps […]
 Monads allow a programming style where programs are written by putting together highly composable parts […] Ruby Module Enumerable: collect, select, group_by, … C# / LINQ IEnumerable<T>: Select, Where, GroupBy, … Java Stream<T>: collect,filter,groupingBy,… MongoDB Aggregation Framework: $project, $match, $group, … map, filter, group, … Haskell Module Data.List:
A Highly Composable Compute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match
Aggregation Pipelines (1) are one of the easiest ways to work with your data. (2) are highly scalable and optimised for performance. (3) are (much) more capable and powerful than you think! 3 4 3 13 6 4 6 3 6 4 $sum$match
Aggregation Pipelines (1) are one of the easiest ways to work with your data. (2) are highly scalable and optimised for performance. (3) are (much) more capable and powerful than you think!
1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 DB Land
1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 DB Land
1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement select id, name, dpt, sal from emps where sal = (select max(sal) from emps as e where e.dpt = emps.dpt) or sal = (select max(sal) from emps as e where e.dpt = emps.dpt and sal < (select max(sal) from emps as e2 where e2.dpt = emps.dpt)); DB Land
1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement select r.id, r.name, r.dpt, r.sal
 from (select id, name, dept, sal,
 rank()
 OVER (PARTITION BY dpt
 ORDER BY sal DESC) as rank
 from emps) AS r
 where r.rank <= 2
 order by r.dpt, r.rank 1 Alex DE 300 3 Cora DE 200 5 Erik US 400 6 Fred US 300 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL DB Land
1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement 1 Alex DE 300 3 Cora DE 200 5 Erik US 400 6 Fred US 300 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 ? DB Land
1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement 1 Alex DE 300 3 Cora DE 200 5 Erik US 400 6 Fred US 300 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 ? "Data should be easy to work with." "The data should serve you. You should not serve the data." "The same (data-) model in your head, in your code, and in your data - NO impedance mismatch." DB Land
1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL DB LandPL Land
PL Land 1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL DB Land
PL Land {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]] {"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, {"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},, {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, {"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},, {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, {"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ DB Land
PL Land {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]] {"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, {"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},, {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, {"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},, {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, {"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by take Ruby DB Land
PL Land emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by take {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]] {"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, {"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},, {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, {"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},, {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, {"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ Ruby DB Land
PL Land }, [{"DE"=> ] ] ] [ [ [ [{"US"=> [{"NL"=> [{"UK"=> }, }, ] emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by take {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]] {"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, {"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},, {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, {"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},, {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, {"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ Ruby DB Land
PL Land },{"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},,[[{"NL"=> {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},,[[{"US"=> }, [{"DE"=> {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ }, {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]][[{"UK"=> ] emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by take ] ]] ]] Ruby DB Land
PL Land emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}takecollect group_by sort_by },{"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, ] [[{"NL"=> {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, ] [[{"US"=> }, [{"DE"=> {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ ] }, {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]][[{"UK"=> ] 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 Ruby DB Land
emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by Ruby PL Land emps.sorted(Comparator.comparing(Employee::getDpt) .thenComparing(Employee::getSal) .reversed()).collect(Collectors
 .groupingBy(Employee::getDpt, Collectors
 .collectingAndThen(Collectors.toList(),l->l.stream() .limit(2).collect( Collectors.toList())))); emps.OrderBy(e => e.Dpt).ThenByDescending(e => e.Sal) .GroupBy(e => e.Dpt) .Select(g => new {Key = g.Key, Emps = g.Take(2)}) C# / LINQ Java Streams take DB Land
PL Land emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}takecollect group_by $sort Ruby DB Land
PL Land emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}takecollect $sort $group Ruby DB Land
PL Land emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}take $sort $group $project Ruby DB Land
PL Land emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]} $sort $group $project $slice Ruby DB Land
PL Land db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
PL Land db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land $project $slice $group$sort
MongoDB PL Land db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline PL Land DB Land $project $slice $group$sort
MongoDB PL Land {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"_id": 7, "name":"Gina", "dpt":"US", "sal":200}, {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"_id": 4, "name":"Drew", "dpt":"US", "sal":200}, {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, {"_id": 2, "name":"Bert", "dpt":"DE", "sal":100}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
MongoDB PL Land {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"_id": 7, "name":"Gina", "dpt":"US", "sal":200}, {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"_id": 4, "name":"Drew", "dpt":"US", "sal":200}, {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, {"_id": 2, "name":"Bert", "dpt":"DE", "sal":100}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
MongoDB PL Land {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"_id": 7, "name":"Gina", "dpt":"US", "sal":200}, {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"_id": 4, "name":"Drew", "dpt":"US", "sal":200}, {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, {"_id": 2, "name":"Bert", "dpt":"DE", "sal":100}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, [{"_id" :"DE", "emps": }, {"_id" :"US", "emps": }, {"_id" :"NL", "emps": }, {"_id" :"UK", "emps": ] ] ] }] [ [ [ db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
MongoDB PL Land {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps": }] [ [ [ db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
MongoDB PL Land {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps": }] [ [ [ db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 Aggregation Pipeline DB Land
MongoDB PL Land {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps": }] [ [ [ db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 "Data should be easy to work with." "The data should serve you. You should not serve the data." "The same (data-) model in your head, in your code, and in your data - NO impedance mismatch." Aggregation Pipeline DB Land
MongoDB db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline emps.OrderBy(e => e.Dpt).ThenByDescending(e => e.Sal) .GroupBy(e => e.Dpt) .Select(g => new {Key = g.Key, Emps = g.Take(2)}) C# emps.sorted(Comparator.comparing(Employee::getDpt) .thenComparing(Employee::getSal) .reversed()).collect(Collectors
 .groupingBy(Employee::getDpt, Collectors
 .collectingAndThen(Collectors.toList(),l->l.stream() .limit(2).collect( Collectors.toList())))); Java emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by Ruby take DB LandPL Land
Aggregation Pipelines (1) are one of the easiest ways to work with your data. (2) are highly scalable and optimised for performance. (3) are (much) more capable and powerful than you think!
Benchmarking PL Land vs DB Land 2,2 GHz Intel Core i7 CPU 16 GB 1600 MHz DDR3 RAM SSD-Storage MongoDB Enterprise 3.4.0-rc0 WiredTiger (12 GB Cache Size, snappy compressor) !
λ PL Land DB Land
λ PL Land DB Land # Employees Data Size Index Size Runtime 1M 50 MB 20 MB 6 s + 7 s 10M 500 MB 200 MB 133 s + 99 s 100M 5 GB 2 GB 2 h - OOM
PL Land DB Land Q
PL Land DB Land Q # Employees Data Size Index Size Runtime Runtime 1M 50 MB 20 MB 6 s + 7 s 100 ms 10M 500 MB 200 MB 133 s + 99 s 1 s 100M 5 GB 2 GB 2 h - OOM 5 m
PL Land DB Land Q 100M 5 GB 2 GB 2 h - OOM 5 m
DB Land 100M 5 GB 2 GB 2 h - OOM 5 m db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ] $slice ) $project $group $sort $project $group $sort 5 GB
DB Land 100M 5 GB 2 GB 2 h - OOM 5 m db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ] $slice ) $project $group $sort $project $group $sort 5 GB"errmsg":"Exceeded	memory	limit	for	$group,	but	didn't	allow	external	sort.
	Pass	allowDiskUse:true	to	opt	in."
DB Land 100M 5 GB 2 GB 2 h - OOM 5 m db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ] $slice ) $project $group $sort $project $group $sort 5 GB ,{allowDiskUse:true}
DB Land 100M 5 GB 2 GB 2 h - OOM 5 m db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ] $slice ) $project $group $sort $project $group $sort 5 GB ,{allowDiskUse:true} ! CPU Load
DB Land 100M 5 GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB mongod --dbpath ~/data/shard1 --port 40001 mongod --dbpath ~/data/shard2 --port 40002 … mongod --dbpath ~/data/shard10 --port 40010 !
DB Land 100M 5 GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB mongod --dbpath ~/data/shard1 --port 40001 mongod --dbpath ~/data/shard2 --port 40002 … mongod --dbpath ~/data/shard10 --port 40010 !
DB Land 100M 5 GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB mongod --dbpath ~/data/shard1 --port 40001 mongod --dbpath ~/data/shard2 --port 40002 … mongod --dbpath ~/data/shard10 --port 40010 ! sh.addShard("Toms-MacBook-Pro.local:40001") sh.addShard("Toms-MacBook-Pro.local:40002") … sh.addShard("Toms-MacBook-Pro.local:40010")
DB Land 100M 5 GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB mongod --dbpath ~/data/shard1 --port 40001 mongod --dbpath ~/data/shard2 --port 40002 … mongod --dbpath ~/data/shard10 --port 40010 ! sh.addShard("Toms-MacBook-Pro.local:40001") sh.addShard("Toms-MacBook-Pro.local:40002") … sh.addShard("Toms-MacBook-Pro.local:40010") sh.shardCollection("DB.emps", {dpt:1})
!DB Land 100M 5 GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB mongod --dbpath ~/data/shard1 --port 40001 mongod --dbpath ~/data/shard2 --port 40002 … mongod --dbpath ~/data/shard10 --port 40010 ! sh.addShard("Toms-MacBook-Pro.local:40001") sh.addShard("Toms-MacBook-Pro.local:40002") … sh.addShard("Toms-MacBook-Pro.local:40010") sh.shardCollection("DB.emps", {dpt:1}) "Micro-Sharding" 0.5 GB0.5 GB0.5 GB0.5 GB0.5 GB 0.5 GB 0.5 GB 0.5 GB 0.5 GB 0.5 GB
DB Land 100M 5 GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB
DB Land 100M 5 GB 2 GB 2 h - OOM 5 m $project $group $sort 0.5 GB0.5 GB 0.5 GB0.5 GB 0.5 GB0.5 GB0.5 GB0.5 GB0.5 GB 0.5 GB $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort
DB Land 100M 5 GB 2 GB 2 h - OOM 5 m $project $group $sort 0.5 GB0.5 GB 0.5 GB0.5 GB 0.5 GB0.5 GB0.5 GB0.5 GB0.5 GB 0.5 GB $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort 6 s ! CPU Load
DB Land {"name":"Cora", "dpt":"DE", "sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} ])
DB Land {"name":"Cora", "dpt":"DE", "sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ])
DB Land {"name":"Cora", "dpt":"DE", "sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ])
DB Land {"name":"Cora", "dpt":"DE", "sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ])
DB Land {"name":"Cora", "dpt":"DE", "sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ ] [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true})
db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land
db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land
{
 "stages": [
 {
 "$cursor": {
 "query": {
 "dpt": "DE"
 },
 "sort": {
 "dpt": 1,
 "sal": -1
 },
 "fields": {
 "dpt": 1,
 "name": 1,
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land
{
 "stages": [
 {
 "$cursor": {
 "query": {
 "dpt": "DE"
 },
 "sort": {
 "dpt": 1,
 "sal": -1
 },
 "fields": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land
{
 "stages": [
 {
 "$cursor": {
 "query": {
 "dpt": "DE"
 },
 "sort": {
 "dpt": 1,
 "sal": -1
 },
 "fields": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $cursor
],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 "rejectedPlans": []
 }
 }
 },
 {
 "$group": {
 "_id": "$dpt",
 "emps": {
 "$push": {
 "name": "$name",
 "sal": "$sal"
 }
 }
 }
 },
 {
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $cursor
],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 "rejectedPlans": []
 }
 }
 },
 {
 "$group": {
 "_id": "$dpt",
 "emps": {
 "$push": {
 "name": "$name",
 "sal": "$sal"
 }
 }
 }
 },
 {
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $cursor
"_id": "$dpt",
 "emps": {
 "$push": {
 "name": "$name",
 "sal": "$sal"
 }
 }
 }
 },
 {
 "$project": {
 "_id": false,
 "dpt": "$_id",
 "emps": {
 "$slice": [
 "$emps",
 {
 "$const": 2
 }
 ]
 }
 }
 }
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $cursor
"_id": "$dpt",
 "emps": {
 "$push": {
 "name": "$name",
 "sal": "$sal"
 }
 }
 }
 },
 {
 "$project": {
 "_id": false,
 "dpt": "$_id",
 "emps": {
 "$slice": [
 "$emps",
 {
 "$const": 2
 }
 ]
 }
 }
 }
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor
"queryPlanner": {
 "plannerVersion": 1,
 "namespace": "DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor
"queryPlanner": {
 "plannerVersion": 1,
 "namespace": "DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION
"multiKeyPaths": {
 "dpt": [],
 "sal": [],
 "name": []
 },
 "isUnique": false,
 "isSparse": false,
 "isPartial": false,
 "indexVersion": 2,
 "direction": "forward",
 "indexBounds": {
 "dpt": [
 "["DE", "DE"]"
 ],
 "sal": [
 "[MaxKey, MinKey]"
 ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION
"multiKeyPaths": {
 "dpt": [],
 "sal": [],
 "name": []
 },
 "isUnique": false,
 "isSparse": false,
 "isPartial": false,
 "indexVersion": 2,
 "direction": "forward",
 "indexBounds": {
 "dpt": [
 "["DE", "DE"]"
 ],
 "sal": [
 "[MaxKey, MinKey]"
 ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting
"multiKeyPaths": {
 "dpt": [],
 "sal": [],
 "name": []
 },
 "isUnique": false,
 "isSparse": false,
 "isPartial": false,
 "indexVersion": 2,
 "direction": "forward",
 "indexBounds": {
 "dpt": [
 "["DE", "DE"]"
 ],
 "sal": [
 "[MaxKey, MinKey]"
 ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting Pipeline Reordering: Index used for matching
"queryPlanner": {
 "plannerVersion": 1,
 "namespace": "DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting Pipeline Reordering: Index used for matching
"queryPlanner": {
 "plannerVersion": 1,
 "namespace": "DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting Pipeline Reordering: Index used for matching Projection Optimization: Query turned to Covered Query
"queryPlanner": {
 "plannerVersion": 1,
 "namespace": "DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting Pipeline Reordering: Index used for matching Projection Optimization: Query turned to Covered Query
DB Land Aggregation Pipelines (1) are one of the easiest ways to work with your data. (2) are highly scalable and optimised for performance. (3) are (much) more capable and powerful than you think!
1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 DB Land _id name dpt sal
1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 DB Land _id name dpt sal 10 3 1 6 10 5 5 10 8 bid
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" $match $graphLookup
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid " {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ]3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ]3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ]3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid " {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { } 2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid "lvl":1,{ } , db.emps.aggregate([ ]) Bert’s bosses {$match: {name:"Bert"}}, {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { } 2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid "lvl":1,{ } , 10 Jill UK 500 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { } 2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid "lvl":1,{ } , 10 Jill UK 500 _id name dpt sal bid " {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { } 2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid "lvl":1,{ } , 10 Jill UK 500 _id name dpt sal bid "lvl":2,{ } , {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid Bert’s bosses { } 2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid "lvl":1,{ } , 10 Jill UK 500 _id name dpt sal bid "lvl":2,{ } , {$match: {name:"Bert"}}, db.emps.aggregate([ ]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid Bert’s bosses { } 2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid "lvl":1,{ } , 10 Jill UK 500 _id name dpt sal bid "lvl":2,{ } , {$match: {name:"Bert"}}, db.emps.aggregate([ ]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid Bert’s bosses {$match: {name:"Bert"}}, db.emps.aggregate([ ]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employees bosseswith most {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" ]) db.emps.aggregate([ , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl" $limit$graphLookup $sort
8 Herb NL 600 10 10 Jill UK 500 5 Erik US 400 105 Erik US 400 10 10 Jill UK 500 6 Fred US 300 5 1 Alex DE 300 10 3 Cora DE 200 1 10 Jill UK 50010 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[]}] ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
8 Herb NL 600 10 10 Jill UK 500 5 Erik US 400 105 Erik US 400 10 10 Jill UK 500 6 Fred US 300 5 1 Alex DE 300 10 3 Cora DE 200 1 10 Jill UK 50010 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[]}] ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
8 Herb NL 600 10 10 Jill UK 500 5 Erik US 400 105 Erik US 400 10 10 Jill UK 500 6 Fred US 300 5 1 Alex DE 300 10 3 Cora DE 200 1 10 Jill UK 50010 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[]}] ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0}[ { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 6 Fred US 300 5 10 Jill UK 500 5 Erik US 400 10 5 Erik US 400 10 10 Jill UK 500 8 Herb NL 600 10 ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 50010 Jill UK 50010 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 1 Alex DE 300 10 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0}[ { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 6 Fred US 300 5 10 Jill UK 500 5 Erik US 400 10 5 Erik US 400 10 10 Jill UK 500 8 Herb NL 600 10 ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0}[ { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 1 Alex DE 300 10 10 Jill UK 500 6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 8 Herb NL 600 10 10 Jill UK 500 ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 50010 Jill UK 50010 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0}[ { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 1 Alex DE 300 10 10 Jill UK 500 6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 8 Herb NL 600 10 10 Jill UK 500 ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} }] ,[ { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, , { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, , 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 1 Alex DE 300 10 10 Jill UK 500 6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 8 Herb NL 600 10 10 Jill UK 500 }] , }] ,}] , ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} }] ,[ { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, , { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, , 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 1 Alex DE 300 10 10 Jill UK 500 6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 8 Herb NL 600 10 10 Jill UK 500 }] , }] ,}] , ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid [ 1 Alex DE 300 10{ ,"bosses":[{ ,"lvl":0} }] ,10 Jill UK 500 10 Jill UK 500{ ,"bosses":[]}] 5 Erik US 400 10{ ,"bosses":[{ ,"lvl":0}10 Jill UK 500 }] , 8 Herb NL 600 10{ ,"bosses":[{ ,"lvl":0}10 Jill UK 500 }] ,}] , 2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]}, 4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]}, 6 Fred US 300 5 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},5 Erik US 400 10 10 Jill UK 500 ]}, 7 Gina US 200 5 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},5 Erik US 400 10 10 Jill UK 500 ]}, 3 Cora DE 200 1 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},1 Alex DE 300 10 10 Jill UK 500 ]}, 9 Ivan NL 400 8 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},8 Herb NL 600 10 10 Jill UK 500 ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid [ 2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]}, 4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]}] The two employees bosseswith most ]) db.emps.aggregate([ , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl" 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) [ 2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]}, 4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]}] The two employees bosseswith most "bid" "_id""$bid" "bosses"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl" 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employees bosseswith most "bid" "_id""$bid" "bosses"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) "bid" "_id""$bid" "bosses" The two employeesbosses with most "bosses.lvl"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) "bid""_id""$bid" "bosses" The two employeesbosses with most "bosses.lvl"
, {$sort:{"bosses.leve:-1}}, {$limit:2} {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "emps" "bosses.lvl" "$_id" "_id" "bid"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "bosses.lvl" "$_id" "_id" "bid" "emps" ,
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}}, $limit$graphLookup $sort$addFields
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
[{ ,"emps":[], "hdcnt":0}] 9 Ivan NL 400 8 [{ ,"emps":[], "hdcnt":0} 7 Gina US 200 5 [{ ,"emps":[], "hdcnt":0} 4 Drew US 200 6 [{ ,"emps":[], "hdcnt":0} 2 Bert DE 100 3 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 8 Herb NL 600 10 9 Ivan NL 400 8 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 6 Fred US 300 5 4 Drew US 200 6 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
[ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} [{ ,"emps":[], "hdcnt":0} 7 Gina US 200 5 [{ ,"emps":[], "hdcnt":0} 4 Drew US 200 6 [{ ,"emps":[], "hdcnt":0} 2 Bert DE 100 3 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 3 Cora DE 200 1 2 Bert DE 100 3 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 8 Herb NL 600 10 9 Ivan NL 400 8 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 6 Fred US 300 5 4 Drew US 200 6 [ { ,"lvl":1}],{ ,"emps":[{ ,"lvl":0}, "hdcnt":2}, 1 Alex DE 300 10 3 Cora DE 200 1 2 Bert DE 100 3 , 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
[ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 3 Cora DE 200 1 2 Bert DE 100 3 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 8 Herb NL 600 10 9 Ivan NL 400 8 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 6 Fred US 300 5 4 Drew US 200 6 [ { ,"lvl":1}],{ ,"emps":[{ ,"lvl":0}, "hdcnt":2}, 1 Alex DE 300 10 3 Cora DE 200 1 2 Bert DE 100 3 , 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
[ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 3 Cora DE 200 1 2 Bert DE 100 3 [ { ,"lvl":1}],{ ,"emps":[{ ,"lvl":0}, "hdcnt":2}, 1 Alex DE 300 10 3 Cora DE 200 1 2 Bert DE 100 3 , 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]}
{$addFields: {tsal:{$reduce: { input: "$emps", initialValue: 0, in: {$add: ["$$value", "$$this.sal"]}}}}}]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]}
{$addFields: {tsal:{$reduce: { input: "$emps", initialValue: 0, in: {$add: ["$$value", "$$this.sal"]}}}}}]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]} $limit$graphLookup $sort$addFields
{$addFields: {tsal:{$reduce: { input: "$emps", initialValue: 0, in: {$add: ["$$value", "$$this.sal"]}}}}}]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]} $addFields $reduce $limit$graphLookup $sort$addFields
{$addFields: {tsal:{$reduce: { input: "$emps", initialValue: 0, in: {$add: ["$$value", "$$this.sal"]}}}}}]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]}
{$addFields: {tsal:{$reduce: { input: "$emps", initialValue: 0, in: {$add: ["$$value", "$$this.sal"]}}}}}]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]}
{$addFields: {tsal:{$reduce: { input: "$emps", initialValue: 0, in: {$add: ["$$value", "$$this.sal"]}}}}}]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]} , "tsal":2700 , "tsal":700
10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid
MongoDB 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 _id name dpt sal bid
MongoDB 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 _id name dpt sal bid Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London loc
MongoDB 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
Chicago Boston Austin Orlando 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
Chicago Boston Austin Orlando ✈ 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
Chicago Boston Austin Orlando $ 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
Chicago Boston Austin Orlando $ 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
Chicago Boston Austin Orlando $ 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
Chicago Boston Austin Orlando $ 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
Chicago Boston Austin Orlando 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc $
Chicago Boston Austin Orlando ✈ 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
Chicago Boston Austin Orlando 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
Chicago Boston Austin Orlando
Chicago Boston Austin Orlando Boston 980 Chicago Boston 2000 Austin Boston 1300 Orlando Chicago 980 Boston Chicago 1150 Austin Chicago 1200 Orlando Austin 2000 Boston Austin 1150 Chicago Austin 1100 Orlando Orlando 1300 Boston Orlando 1200 Chicago Orlando 1100 Austin start enddist
Orlando 1300 BostonBoston 980 ChicagoChicago 1200 OrlandoOrlando 1100 AustinAustin 2000 BostonBoston 980 ChicagoChicago 1150 AustinAustin 1100 OrlandoOrlando 1300 BostonBoston 1300 OrlandoOrlando 1100 AustinAustin 1150 ChicagoChicago 980 BostonBoston 1300 OrlandoOrlando 1200 ChicagoChicago 1150 AustinAustin 2000 BostonBoston 2000 AustinAustin 1100 OrlandoOrlando 1200 ChicagoChicago 980 BostonBoston 2000 AustinAustin 1150 ChicagoChicago 1200 Orlando …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] start enddist Boston 980 Chicago Boston 2000 Austin Boston 1300 Orlando Chicago 980 Boston Chicago 1150 Austin Chicago 1200 Orlando Austin 2000 Boston Austin 1150 Chicago Austin 1100 Orlando Orlando 1300 Boston Orlando 1200 Chicago Orlando 1100 Austin Chicago Boston Austin Orlando $limit$graphLookup $sort...
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] 5280Boston 980 Chicago Chicago 1200 Orlando Orlando 1100 Austin Austin 2000 Boston 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston 4530Boston 1300 Orlando Orlando 1100 Austin Austin 1150 Chicago Chicago 980 Boston 5650Boston 1300 Orlando Orlando 1200 Chicago Chicago 1150 Austin Austin 2000 Boston 5280Boston 2000 Austin Austin 1100 Orlando Orlando 1200 Chicago Chicago 980 Boston 5650Boston 2000 Austin Austin 1150 Chicago Chicago 1200 Orlando Orlando 1300 Boston start enddist start enddist start enddist start enddist tdist Chicago Boston Austin Orlando
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] 5280Boston 980 Chicago Chicago 1200 Orlando Orlando 1100 Austin Austin 2000 Boston 4530Boston 1300 Orlando Orlando 1100 Austin Austin 1150 Chicago Chicago 980 Boston 5650Boston 1300 Orlando Orlando 1200 Chicago Chicago 1150 Austin Austin 2000 Boston 5280Boston 2000 Austin Austin 1100 Orlando Orlando 1200 Chicago Chicago 980 Boston 5650Boston 2000 Austin Austin 1150 Chicago Chicago 1200 Orlando Orlando 1300 Boston start enddist start enddist start enddist start enddist tdist Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] start enddist start enddist start enddist start enddist tdist Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston ✈
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston $
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston $
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston $
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston $
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston $
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston ✈
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
Facets {
MongoDB
MongoDB _id name dpt sal
MongoDB _id name dpt sal
MongoDB _id name dpt sal expertise
MongoDB _id name dpt sal expertise 5 results for mongodb Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔
3 results for oracle Fred location: US salary: 300 expertise: Oracle, Cobol Gina location: US salary: 200 expertise: Oracle, Pascal Ivan location: NL salary: 400 expertise: Oracle, Fortran Search | EmpView Location All US NL ✔ Expertise All Oracle Cobol Pascal Fortran ✔ Salary All 100 - 200 200 - 400 ✔ oracle (2) (1) (3) (1) (1) (1) (1) (2) https://www.awesomeempview.com/search/f?type=all&key… MongoDB _id name dpt sal expertise
MongoDB _id name dpt sal expertise Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb _id name dpt sal expertise
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb _id name dpt sal expertise db.emps.aggregate([
 { $match: { $text : { $search : "mongodb" }}},
 { $sortByCount: "$dpt"}
 ])
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb _id name dpt sal expertise db.emps.aggregate([
 { $match: { $text : { $search : "mongodb" }}},
 { $sortByCount: "$dpt"}
 ])
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb {"_id":"DE", "count":3}, {"_id":"NL", "count":1}, {"_id":"US", "count":1} _id name dpt sal expertise db.emps.aggregate([
 { $match: { $text : { $search : "mongodb" }}},
 { $sortByCount: "$dpt"}
 ])
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb db.emps.aggregate( [
 {$match: { $text : {$search : "mongodb" }}},
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ]) _id name dpt sal expertise {"_id":"MongoDB","count":5}, {"_id":"Java","count":2}, {"_id":"Ruby","count":2}, {"_id":"Scala","count":1}
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb db.emps.aggregate([
 {$match: { $text : {$search : "mongodb" }}},
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]) {"_id":100,"count":2}, {"_id":201,"count":2}, {"_id":401,"count":1} _id name dpt sal expertise
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb db.emps.aggregate([
 {$match: { $text : {$search : "mongodb" }}},
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity],
 output: {
 count: {$sum: 1},
 matches: {$push: "$$CURRENT"}
 }}}
 ]) {"_id":100,"count":2,"matches":[ ]}, {"_id":201,"count":2,"matches":[ ]}, {"_id":401,"count":1,"matches":[ ]} _id name dpt sal expertise
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb db.emps.aggregate([
 {$match: { $text : {$search : "mongodb" }}},
 {$bucketAuto: {
 groupBy: "$sal",
 buckets: 4}}
 ]) {"_id":{"min":100,"max":200}, "count":1}, {"_id":{"min":200,"max":300}, "count":1}, {"_id":{"min":300,"max":400}, “count":1}, {"_id":{"min":400,"max":600}, "count":2} _id name dpt sal expertise
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb db.emps.aggregate([
 {$match: { $text : {$search :
 {$facet: {
 "Location": [
 {$sortByCount: "$dpt"}
 ],
 "Expertise":[
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ],
 "Salary":[
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]}}]) {"Location":[
 {"_id":"DE","count":3},
 {"_id":"NL","count":1},
 {"_id":"US","count":1}],
 
 "Expertise":[
 {"_id":"MongoDB","count":5},
 {"_id":"Java","count":2},
 {"_id":"Ruby","count":2},
 {"_id":"Scala","count":1}],
 
 "Salary":[
 {"_id":100,"count":2},
 {"_id":201,"count":2},
 {"_id":401,"count":1}]} _id name dpt sal expertise }}},"mongodb"
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb {"Location":[
 {"_id":"DE","count":3},
 {"_id":"NL","count":1},
 {"_id":"US","count":1}],
 
 "Expertise":[
 {"_id":"MongoDB","count":5},
 {"_id":"Java","count":2},
 {"_id":"Ruby","count":2},
 {"_id":"Scala","count":1}],
 
 "Salary":[
 {"_id":100,"count":2},
 {"_id":201,"count":2},
 {"_id":401,"count":1}]} _id name dpt sal expertise db.emps.aggregate([
 {$match: { $text : {$search :
 {$facet: {
 "Location": [
 {$sortByCount: "$dpt"}
 ],
 "Expertise":[
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ],
 "Salary":[
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]}}]) }}},"mongodb"
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb {"Location":[
 {"_id":"DE","count":3},
 {"_id":"NL","count":1},
 {"_id":"US","count":1}],
 
 "Expertise":[
 {"_id":"MongoDB","count":5},
 {"_id":"Java","count":2},
 {"_id":"Ruby","count":2},
 {"_id":"Scala","count":1}],
 
 "Salary":[
 {"_id":100,"count":2},
 {"_id":201,"count":2},
 {"_id":401,"count":1}]} _id name dpt sal expertise db.emps.aggregate([
 {$match: { $text : {$search :
 {$facet: {
 "Location": [
 {$sortByCount: "$dpt"}
 ],
 "Expertise":[
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ],
 "Salary":[
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]}}]) }}},"mongodb"
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb {"Location":[
 {"_id":"DE","count":3},
 {"_id":"NL","count":1},
 {"_id":"US","count":1}],
 
 "Expertise":[
 {"_id":"MongoDB","count":5},
 {"_id":"Java","count":2},
 {"_id":"Ruby","count":2},
 {"_id":"Scala","count":1}],
 
 "Salary":[
 {"_id":100,"count":2},
 {"_id":201,"count":2},
 {"_id":401,"count":1}]} _id name dpt sal expertise db.emps.aggregate([
 {$match: { $text : {$search :
 {$facet: {
 "Location": [
 {$sortByCount: "$dpt"}
 ],
 "Expertise":[
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ],
 "Salary":[
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]}}]) }}},""mongodb" "ruby""
Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb _id name dpt sal expertise db.emps.aggregate([
 {$match: { $text : {$search :
 {$facet: {
 "Location": [
 {$sortByCount: "$dpt"}
 ],
 "Expertise":[
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ],
 "Salary":[
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]}}]) }}},""mongodb" "ruby"" {"Location":[
 {"_id":"DE","count":1},
 {"_id":"US","count":1}],
 
 "Expertise":[
 {"_id":"MongoDB","count":2},
 {"_id":"Ruby","count":2}],
 
 "Salary":[
 {"_id":201,"count":2}]}
MongoDB Alex location: DE salary: 300 expertise: MongoDB, Ruby Erik location: US salary: 400 expertise: MongoDB, Ruby Location All DE Salary All 200 - 400 Expertise All MongoDB ✔ (2) ✔ 1( ( )2 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 2 results for mongodb _id name dpt sal expertise db.emps.aggregate([
 {$match: { $text : {$search :
 {$facet: {
 "Location": [
 {$sortByCount: "$dpt"}
 ],
 "Expertise":[
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ],
 "Salary":[
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]}}]) }}},""mongodb" "ruby"" {"Location":[
 {"_id":"DE","count":1},
 {"_id":"US","count":1}],
 
 "Expertise":[
 {"_id":"MongoDB","count":2},
 {"_id":"Ruby","count":2}],
 
 "Salary":[
 {"_id":201,"count":2}]})
MongoDB
MongoDB One more thing…
PL Land
PL Land nats = nats. (nats. {|n| nats. (n-1) . (1) . {|p| n % p != 0} . }) drop take map all? mapzip [1,2,3,4,5,6,7,8,9,10] Ruby
PL Land [[1, true ], [2, true ], [3, true ], [4, false], [5, true ], [6, false], [7, true ], [8, false], [9, false], [10,false]] nats = nats. (nats. {|n| nats. (n-1) . (1) . {|p| n % p != 0} . }) drop take map all? mapzip [1,2,3,4,5,6,7,8,9,10] Ruby
PL Land drop take map all? mapzip [1,2,3,4,5,6,7,8,9,10] Ruby
PL Land drop take map all? mapzip $range: [1, 11, 1] Ruby
PL Land drop take map all? map$zip $range: [1, 11, 1] Ruby
PL Land drop take map all? map$zip $range: [1, 11, 1] ["A", "B", "C"] [10, 20, 30] Ruby
PL Land drop take map all? map$zip $range: [1, 11, 1] ["A", "B", "C"] [10, 20, 30] [["A",10], ["B",20], ["C",30]] Ruby
PL Land drop take map all? $map$zip $range: [1, 11, 1] Ruby
PL Land drop map all? $slice$map$zip $range: [1, 11, 1] Ruby
PL Land map all? $slice $slice $map$zip $range: [1, 11, 1] Ruby
PL Land all? $slice $slice $map $map$zip $range: [1, 11, 1] Ruby
PL Land $slice $slice $map $allElementsTrue $map$zip $range: [1, 11, 1] Ruby
PL Land $slice $slice $map $allElementsTrue $map $zip $range: [1, 11, 1] Ruby
$let: {vars: {nats: { }}, in: {
 : {inputs: ["$$nats", {
 : {input: "$$nats", as: "n", in: {
 : [{
 : {input: { : [{ : ["$$nats", {$subtract: ["$$n", 1]}]}, 1, {$size: "$$nats"}]}, as: "p", in: { $ne: [{$mod: ["$$n", "$$p"]}, 0]}}}]}}}]}}} PL Land $slice $slice $map $allElementsTrue $map $zip : [1, 11, 1]$range Aggregation Pipeline
$let: {vars: {nats: { }}, in: {
 : {inputs: ["$$nats", {
 : {input: "$$nats", as: "n", in: {
 : [{
 : {input: { : [{ : ["$$nats", {$subtract: ["$$n", 1]}]}, 1, {$size: "$$nats"}]}, as: "p", in: { $ne: [{$mod: ["$$n", "$$p"]}, 0]}}}]}}}]}}} PL Land $slice $slice $map $allElementsTrue $map $zip : [1, 11, 1]$range Aggregation Pipeline $allElementsTrue$map$slice$slice $map $range $zip
MongoDB PL Land $let: {vars: {nats: { }}, in: {
 : {inputs: ["$$nats", {
 : {input: "$$nats", as: "n", in: {
 : [{
 : {input: { : [{ : ["$$nats", {$subtract: ["$$n", 1]}]}, 1, {$size: "$$nats"}]}, as: "p", in: { $ne: [{$mod: ["$$n", "$$p"]}, 0]}}}]}}}]}}} $slice $slice $map $allElementsTrue $map $zip : [1, 11, 1]$range Aggregation Pipeline $allElementsTrue$map$slice$slice $map $range $zip
MongoDB PL Land [[1, true ], [2, true ], [3, true ], [4, false], [5, true ], [6, false], [7, true ], [8, false], [9, false], [10,false]] $let: {vars: {nats: { }}, in: {
 : {inputs: ["$$nats", {
 : {input: "$$nats", as: "n", in: {
 : [{
 : {input: { : [{ : ["$$nats", {$subtract: ["$$n", 1]}]}, 1, {$size: "$$nats"}]}, as: "p", in: { $ne: [{$mod: ["$$n", "$$p"]}, 0]}}}]}}}]}}} $slice $slice $map $allElementsTrue $map $zip : [1, 11, 1]$range Aggregation Pipeline $allElementsTrue$map$slice$slice $map $range $zip
$slice $slice $map $allElementsTrue $map $zip $range
$slice $map $allElementsTrue $zip $range
$indexStats $stdDevSamp $stdDevPop $sqrt $abs $log $log10 $ln $pow $exp $trunc $ceil $floor $arrayElemAt $concatArrays $isArray $filter $avg $min $max $sum $stdDevPop $stdDevSamp $split $indexOf $reduce $reverseArray $indexOfArray $type $isoWeekYear $isoDayOfWeek $isoWeek $in $switch $count $replaceRoot $addFields $graphLookup $facet $bucket $bucketAuto $sortByCount $out $redact $setEquals $setIntersection$setUnion $setDifference $setIsSubset $anyElementTrue $literal $size $geoNear $millisecond $concat $project $match $limit $skip $unwind $group $sort $and $or $not $cmp $eq $gt $gte $lt $lte $ne $abs $add $ceil $divide $mod $multiply $subtract $toLower $toUpper $strcasecmp $meta $let $dayOfYear $dayOfMonth $dayOfWeek $year $month $week $hour $minute $second $millisecond $dateToString $cond $ifNull $first $last $push $addToSet $indexOfBytes $indexOfCP $strLenBytes $strLenCP $substrBytes $substrCP $slice $map $allElementsTrue $zip $range $sample$lookup $dateToString $collStats
3.0 3.4 3.2 2.6 2.4 2.2 $indexStats $stdDevSamp $stdDevPop $sqrt $abs $log $log10 $ln $pow $exp $trunc $ceil $floor $arrayElemAt $concatArrays $isArray $filter $avg $min $max $sum $stdDevPop $stdDevSamp $out $redact $setEquals $setIntersection$setUnion $setDifference $setIsSubset $anyElementTrue $literal $size $geoNear $millisecond $concat $project $match $limit $skip $unwind $group $sort $and $or $not $cmp $eq $gt $gte $lt $lte $ne $abs $add $ceil $divide $mod $multiply $subtract $toLower $toUpper $strcasecmp $meta $let $dayOfYear $dayOfMonth $dayOfWeek $year $month $week $hour $minute $second $millisecond $dateToString $cond $ifNull $first $last $push $addToSet $slice $map $allElementsTrue $sample$lookup $dateToString $split $indexOf $reduce $reverseArray $indexOfArray $type $isoWeekYear $isoDayOfWeek $isoWeek $in $switch $count $replaceRoot $addFields $graphLookup $facet $bucket $bucketAuto $sortByCount $indexOfBytes $indexOfCP $strLenBytes $strLenCP $substrBytes $substrCP $zip $range $collStats
2.4 $geoNear $millisecond $concat 2.2 $avg $min $max $sum $stdDevPop $stdDevSamp $project $match $limit $skip $unwind $group $sort $and $or $not $cmp $eq $gt $gte $lt $lte $ne $abs $add $ceil $divide $mod $multiply $subtract $toLower $toUpper $strcasecmp $meta $let $dayOfYear $dayOfMonth $dayOfWeek $year $month $week $hour $minute $second $millisecond $dateToString $cond $ifNull $first $last $push $addToSet $map 2.6 $out $redact $setEquals $setIntersection$setUnion $setDifference $setIsSubset $anyElementTrue $literal $size $allElementsTrue 3.2$indexStats $stdDevSamp $stdDevPop $sqrt $abs $log $log10 $ln $pow $exp $trunc $ceil $floor $arrayElemAt $concatArrays $isArray $filter $slice $sample$lookup 3.0$dateToString 3.4 $indexOf $indexOfArray $type $isoWeekYear $in $switch $count $replaceRoot $addFields $graphLookup $facet $bucket $bucketAuto $sortByCount $indexOfBytes $indexOfCP$substrBytes $substrCP $zip $range $split $reduce $reverseArray $isoWeekYear $isoDayOfWeek $isoWeek $strLenBytes $strLenCP $collStats Data-Parallel 
 Pipeline Execution Shard 1 Shard 2 Shard 3 Shard N mongos Q Pipeline
 Optimisations Pipeline Projection Optimization Pipeline Coalescence Optimization . . . Pipeline Reordering Pipeline Combining
2.4 $geoNear $millisecond $concat 2.2 $avg $min $max $sum $stdDevPop $stdDevSamp $project $match $limit $skip $unwind $group $sort $and $or $not $cmp $eq $gt $gte $lt $lte $ne $abs $add $ceil $divide $mod $multiply $subtract $toLower $toUpper $strcasecmp $meta $let $dayOfYear $dayOfMonth $dayOfWeek $year $month $week $hour $minute $second $millisecond $dateToString $cond $ifNull $first $last $push $addToSet $map 2.6 $out $redact $setEquals $setIntersection$setUnion $setDifference $setIsSubset $anyElementTrue $literal $size $allElementsTrue 3.2$indexStats $stdDevSamp $stdDevPop $sqrt $abs $log $log10 $ln $pow $exp $trunc $ceil $floor $arrayElemAt $concatArrays $isArray $filter $slice $sample$lookup 3.0$dateToString 3.4 $indexOf $indexOfArray $type $isoWeekYear $in $switch $count $replaceRoot $addFields $graphLookup $facet $bucket $bucketAuto $sortByCount $indexOfBytes $indexOfCP$substrBytes $substrCP $zip $range $split $reduce $reverseArray $isoWeekYear $isoDayOfWeek $isoWeek $strLenBytes $strLenCP $collStats
Aggregation Pipelines (1) are one of the easiest ways to work with your data. (2) are highly scalable and optimised for performance. (3) are (much) more capable and powerful than you think!
Use the Force Aggregation Pipelines! And take control over your Data.
ASK THE EXPERTS Get your technical questions answered By appointment only – register in one of two ways: In person Online Come to the MongoDB Team Stand on the ground floor calendly.com/mongodb

Advanced MongoDB Aggregation Pipelines

  • 1.
  • 2.
    { "About me": { "Name" : "Tom Schreiber", "Title" : "Senior Consulting Engineer", "Email" : "tom.schreiber@mongodb.com", "Twitter" : "@SchreiberTom1", "Location" : "London, UK" } }
  • 5.
    "Data should beeasy to work with." "The data should serve you. You should not serve the data." "The same (data-) model in your head, in your code, and in your data - NO impedance mismatch." Eliot Horowitz CTO & Co-Founder of MongoDB MongoDB World’16
  • 6.
    MongoDB Aggregation Framework "Datashould be easy to work with." "The data should serve you. You should not serve the data." "The same (data-) model in your head, in your code, and in your data - NO impedance mismatch."
  • 7.
    A Highly ComposableCompute Pipeline MongoDB Aggregation Framework $sum$match
  • 8.
    A Highly ComposableCompute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match
  • 9.
    A Highly ComposableCompute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match
  • 10.
    A Highly ComposableCompute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match Notions of computation and monads Eugenio Moggi∗ Abstract The λ-calculus is considered an useful mathematical tool in the study of programming languages, since programs can be identified with λ-terms. However, if one goes further and uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced (programs are identified with total functions from values to values), that may jeopardise the applicability of theoretical results. In this paper we introduce calculi based on a categorical semantics for computations, that provide a correct basis for proving equivalence of programs, for a wide range of notions of computation.
  • 11.
    A Highly ComposableCompute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match Notions of computation and monads Eugenio Moggi∗ Abstract The λ-calculus is considered an useful mathematical tool in the study of programming languages, since programs can be identified with λ-terms. However, if one goes further and uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced (programs are identified with total functions from values to values), that may jeopardise the applicability of theoretical results. In this paper we introduce calculi based on a categorical semantics for computations, that provide a correct basis for proving equivalence of programs, for a wide range of notions of computation. A monad defines what it means to chain operations together. 
 This allows the programmer to build pipelines that process data in a series of steps […]
 Monads allow a programming style where programs are written by putting together highly composable parts […]
  • 12.
    A Highly ComposableCompute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match Notions of computation and monads Eugenio Moggi∗ Abstract The λ-calculus is considered an useful mathematical tool in the study of programming languages, since programs can be identified with λ-terms. However, if one goes further and uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced (programs are identified with total functions from values to values), that may jeopardise the applicability of theoretical results. In this paper we introduce calculi based on a categorical semantics for computations, that provide a correct basis for proving equivalence of programs, for a wide range of notions of computation. A monad defines what it means to chain operations together. 
 This allows the programmer to build pipelines that process data in a series of steps […]
 Monads allow a programming style where programs are written by putting together highly composable parts […] Ruby Module Enumerable: collect, select, group_by, … C# / LINQ IEnumerable<T>: Select, Where, GroupBy, … Java Stream<T>: collect,filter,groupingBy,… MongoDB Aggregation Framework: $project, $match, $group, … map, filter, group, … Haskell Module Data.List:
  • 13.
    A Highly ComposableCompute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match
  • 14.
    Aggregation Pipelines (1) areone of the easiest ways to work with your data. (2) are highly scalable and optimised for performance. (3) are (much) more capable and powerful than you think! 3 4 3 13 6 4 6 3 6 4 $sum$match
  • 15.
    Aggregation Pipelines (1) areone of the easiest ways to work with your data. (2) are highly scalable and optimised for performance. (3) are (much) more capable and powerful than you think!
  • 16.
    1 Alex DE300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 DB Land
  • 17.
    1 Alex DE300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 DB Land
  • 18.
    1 Alex DE300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement select id, name, dpt, sal from emps where sal = (select max(sal) from emps as e where e.dpt = emps.dpt) or sal = (select max(sal) from emps as e where e.dpt = emps.dpt and sal < (select max(sal) from emps as e2 where e2.dpt = emps.dpt)); DB Land
  • 19.
    1 Alex DE300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement select r.id, r.name, r.dpt, r.sal
 from (select id, name, dept, sal,
 rank()
 OVER (PARTITION BY dpt
 ORDER BY sal DESC) as rank
 from emps) AS r
 where r.rank <= 2
 order by r.dpt, r.rank 1 Alex DE 300 3 Cora DE 200 5 Erik US 400 6 Fred US 300 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL DB Land
  • 20.
    1 Alex DE300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement 1 Alex DE 300 3 Cora DE 200 5 Erik US 400 6 Fred US 300 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 ? DB Land
  • 21.
    1 Alex DE300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement 1 Alex DE 300 3 Cora DE 200 5 Erik US 400 6 Fred US 300 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 ? "Data should be easy to work with." "The data should serve you. You should not serve the data." "The same (data-) model in your head, in your code, and in your data - NO impedance mismatch." DB Land
  • 22.
    1 Alex DE300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL DB LandPL Land
  • 23.
    PL Land 1 AlexDE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL DB Land
  • 24.
    PL Land {"id"=>10, "name"=>"Jill","dpt"=>"UK", "sal"=>500}]] {"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, {"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},, {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, {"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},, {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, {"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ DB Land
  • 25.
    PL Land {"id"=>10, "name"=>"Jill","dpt"=>"UK", "sal"=>500}]] {"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, {"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},, {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, {"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},, {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, {"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by take Ruby DB Land
  • 26.
    PL Land emps. {|e|[e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by take {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]] {"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, {"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},, {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, {"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},, {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, {"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ Ruby DB Land
  • 27.
    PL Land }, [{"DE"=> ] ] ] [ [ [ [{"US"=> [{"NL"=> [{"UK"=> }, }, ] emps. {|e|[e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by take {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]] {"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, {"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},, {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, {"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},, {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, {"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ Ruby DB Land
  • 28.
    PL Land },{"id"=> 9,"name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},,[[{"NL"=> {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},,[[{"US"=> }, [{"DE"=> {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ }, {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]][[{"UK"=> ] emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by take ] ]] ]] Ruby DB Land
  • 29.
    PL Land emps. {|e|[e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}takecollect group_by sort_by },{"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, ] [[{"NL"=> {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, ] [[{"US"=> }, [{"DE"=> {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ ] }, {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]][[{"UK"=> ] 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 Ruby DB Land
  • 30.
    emps. {|e| [e["dpt"],-e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by Ruby PL Land emps.sorted(Comparator.comparing(Employee::getDpt) .thenComparing(Employee::getSal) .reversed()).collect(Collectors
 .groupingBy(Employee::getDpt, Collectors
 .collectingAndThen(Collectors.toList(),l->l.stream() .limit(2).collect( Collectors.toList())))); emps.OrderBy(e => e.Dpt).ThenByDescending(e => e.Sal) .GroupBy(e => e.Dpt) .Select(g => new {Key = g.Key, Emps = g.Take(2)}) C# / LINQ Java Streams take DB Land
  • 31.
    PL Land emps. {|e|[e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}takecollect group_by $sort Ruby DB Land
  • 32.
    PL Land emps. {|e|[e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}takecollect $sort $group Ruby DB Land
  • 33.
    PL Land emps. {|e|[e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}take $sort $group $project Ruby DB Land
  • 34.
    PL Land emps. {|e|[e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]} $sort $group $project $slice Ruby DB Land
  • 35.
    PL Land db.emps.aggregate([ { :{dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
  • 36.
    PL Land db.emps.aggregate([ { :{dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land $project $slice $group$sort
  • 37.
    MongoDB PL Land db.emps.aggregate([ { :{dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline PL Land DB Land $project $slice $group$sort
  • 38.
    MongoDB PL Land {"_id":10, "name":"Jill","dpt":"UK", "sal":500}] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"_id": 7, "name":"Gina", "dpt":"US", "sal":200}, {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"_id": 4, "name":"Drew", "dpt":"US", "sal":200}, {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, {"_id": 2, "name":"Bert", "dpt":"DE", "sal":100}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
  • 39.
    MongoDB PL Land {"_id":10, "name":"Jill","dpt":"UK", "sal":500}] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"_id": 7, "name":"Gina", "dpt":"US", "sal":200}, {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"_id": 4, "name":"Drew", "dpt":"US", "sal":200}, {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, {"_id": 2, "name":"Bert", "dpt":"DE", "sal":100}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
  • 40.
    MongoDB PL Land {"_id":10, "name":"Jill","dpt":"UK", "sal":500}] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"_id": 7, "name":"Gina", "dpt":"US", "sal":200}, {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"_id": 4, "name":"Drew", "dpt":"US", "sal":200}, {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, {"_id": 2, "name":"Bert", "dpt":"DE", "sal":100}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, [{"_id" :"DE", "emps": }, {"_id" :"US", "emps": }, {"_id" :"NL", "emps": }, {"_id" :"UK", "emps": ] ] ] }] [ [ [ db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
  • 41.
    MongoDB PL Land {"_id": 3,"name":"Cora", "dpt":"DE", "sal":200}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps": }] [ [ [ db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
  • 42.
    MongoDB PL Land {"_id": 3,"name":"Cora", "dpt":"DE", "sal":200}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps": }] [ [ [ db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 Aggregation Pipeline DB Land
  • 43.
    MongoDB PL Land {"_id": 3,"name":"Cora", "dpt":"DE", "sal":200}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps": }] [ [ [ db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 "Data should be easy to work with." "The data should serve you. You should not serve the data." "The same (data-) model in your head, in your code, and in your data - NO impedance mismatch." Aggregation Pipeline DB Land
  • 44.
    MongoDB db.emps.aggregate([ { : {dpt:1,sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline emps.OrderBy(e => e.Dpt).ThenByDescending(e => e.Sal) .GroupBy(e => e.Dpt) .Select(g => new {Key = g.Key, Emps = g.Take(2)}) C# emps.sorted(Comparator.comparing(Employee::getDpt) .thenComparing(Employee::getSal) .reversed()).collect(Collectors
 .groupingBy(Employee::getDpt, Collectors
 .collectingAndThen(Collectors.toList(),l->l.stream() .limit(2).collect( Collectors.toList())))); Java emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by Ruby take DB LandPL Land
  • 45.
    Aggregation Pipelines (1) areone of the easiest ways to work with your data. (2) are highly scalable and optimised for performance. (3) are (much) more capable and powerful than you think!
  • 46.
    Benchmarking PL Land vsDB Land 2,2 GHz Intel Core i7 CPU 16 GB 1600 MHz DDR3 RAM SSD-Storage MongoDB Enterprise 3.4.0-rc0 WiredTiger (12 GB Cache Size, snappy compressor) !
  • 47.
  • 48.
    λ PL Land DBLand # Employees Data Size Index Size Runtime 1M 50 MB 20 MB 6 s + 7 s 10M 500 MB 200 MB 133 s + 99 s 100M 5 GB 2 GB 2 h - OOM
  • 49.
    PL Land DBLand Q
  • 50.
    PL Land DBLand Q # Employees Data Size Index Size Runtime Runtime 1M 50 MB 20 MB 6 s + 7 s 100 ms 10M 500 MB 200 MB 133 s + 99 s 1 s 100M 5 GB 2 GB 2 h - OOM 5 m
  • 51.
    PL Land DBLand Q 100M 5 GB 2 GB 2 h - OOM 5 m
  • 52.
    DB Land 100M 5GB 2 GB 2 h - OOM 5 m db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ] $slice ) $project $group $sort $project $group $sort 5 GB
  • 53.
    DB Land 100M 5GB 2 GB 2 h - OOM 5 m db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ] $slice ) $project $group $sort $project $group $sort 5 GB"errmsg":"Exceeded memory limit for $group, but didn't allow external sort.
 Pass allowDiskUse:true to opt in."
  • 54.
    DB Land 100M 5GB 2 GB 2 h - OOM 5 m db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ] $slice ) $project $group $sort $project $group $sort 5 GB ,{allowDiskUse:true}
  • 55.
    DB Land 100M 5GB 2 GB 2 h - OOM 5 m db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ] $slice ) $project $group $sort $project $group $sort 5 GB ,{allowDiskUse:true} ! CPU Load
  • 56.
    DB Land 100M 5GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB mongod --dbpath ~/data/shard1 --port 40001 mongod --dbpath ~/data/shard2 --port 40002 … mongod --dbpath ~/data/shard10 --port 40010 !
  • 57.
    DB Land 100M 5GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB mongod --dbpath ~/data/shard1 --port 40001 mongod --dbpath ~/data/shard2 --port 40002 … mongod --dbpath ~/data/shard10 --port 40010 !
  • 58.
    DB Land 100M 5GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB mongod --dbpath ~/data/shard1 --port 40001 mongod --dbpath ~/data/shard2 --port 40002 … mongod --dbpath ~/data/shard10 --port 40010 ! sh.addShard("Toms-MacBook-Pro.local:40001") sh.addShard("Toms-MacBook-Pro.local:40002") … sh.addShard("Toms-MacBook-Pro.local:40010")
  • 59.
    DB Land 100M 5GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB mongod --dbpath ~/data/shard1 --port 40001 mongod --dbpath ~/data/shard2 --port 40002 … mongod --dbpath ~/data/shard10 --port 40010 ! sh.addShard("Toms-MacBook-Pro.local:40001") sh.addShard("Toms-MacBook-Pro.local:40002") … sh.addShard("Toms-MacBook-Pro.local:40010") sh.shardCollection("DB.emps", {dpt:1})
  • 60.
    !DB Land 100M 5GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB mongod --dbpath ~/data/shard1 --port 40001 mongod --dbpath ~/data/shard2 --port 40002 … mongod --dbpath ~/data/shard10 --port 40010 ! sh.addShard("Toms-MacBook-Pro.local:40001") sh.addShard("Toms-MacBook-Pro.local:40002") … sh.addShard("Toms-MacBook-Pro.local:40010") sh.shardCollection("DB.emps", {dpt:1}) "Micro-Sharding" 0.5 GB0.5 GB0.5 GB0.5 GB0.5 GB 0.5 GB 0.5 GB 0.5 GB 0.5 GB 0.5 GB
  • 61.
    DB Land 100M 5GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB
  • 62.
    DB Land 100M 5GB 2 GB 2 h - OOM 5 m $project $group $sort 0.5 GB0.5 GB 0.5 GB0.5 GB 0.5 GB0.5 GB0.5 GB0.5 GB0.5 GB 0.5 GB $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort
  • 63.
    DB Land 100M 5GB 2 GB 2 h - OOM 5 m $project $group $sort 0.5 GB0.5 GB 0.5 GB0.5 GB 0.5 GB0.5 GB0.5 GB0.5 GB0.5 GB 0.5 GB $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort $project $group $sort 6 s ! CPU Load
  • 64.
    DB Land {"name":"Cora", "dpt":"DE","sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} ])
  • 65.
    DB Land {"name":"Cora", "dpt":"DE","sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ])
  • 66.
    DB Land {"name":"Cora", "dpt":"DE","sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ])
  • 67.
    DB Land {"name":"Cora", "dpt":"DE","sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ])
  • 68.
    DB Land {"name":"Cora", "dpt":"DE","sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ ] [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true})
  • 69.
    db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project:{dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land
  • 70.
    db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project:{dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land
  • 71.
    {
 "stages": [
 {
 "$cursor": {
 "query":{
 "dpt": "DE"
 },
 "sort": {
 "dpt": 1,
 "sal": -1
 },
 "fields": {
 "dpt": 1,
 "name": 1,
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land
  • 72.
    {
 "stages": [
 {
 "$cursor": {
 "query":{
 "dpt": "DE"
 },
 "sort": {
 "dpt": 1,
 "sal": -1
 },
 "fields": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land
  • 73.
    {
 "stages": [
 {
 "$cursor": {
 "query":{
 "dpt": "DE"
 },
 "sort": {
 "dpt": 1,
 "sal": -1
 },
 "fields": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $cursor
  • 74.
    ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 "rejectedPlans":[]
 }
 }
 },
 {
 "$group": {
 "_id": "$dpt",
 "emps": {
 "$push": {
 "name": "$name",
 "sal": "$sal"
 }
 }
 }
 },
 {
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $cursor
  • 75.
    ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 "rejectedPlans":[]
 }
 }
 },
 {
 "$group": {
 "_id": "$dpt",
 "emps": {
 "$push": {
 "name": "$name",
 "sal": "$sal"
 }
 }
 }
 },
 {
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $cursor
  • 76.
    "_id": "$dpt",
 "emps": {
 "$push":{
 "name": "$name",
 "sal": "$sal"
 }
 }
 }
 },
 {
 "$project": {
 "_id": false,
 "dpt": "$_id",
 "emps": {
 "$slice": [
 "$emps",
 {
 "$const": 2
 }
 ]
 }
 }
 }
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $cursor
  • 77.
    "_id": "$dpt",
 "emps": {
 "$push":{
 "name": "$name",
 "sal": "$sal"
 }
 }
 }
 },
 {
 "$project": {
 "_id": false,
 "dpt": "$_id",
 "emps": {
 "$slice": [
 "$emps",
 {
 "$const": 2
 }
 ]
 }
 }
 }
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor
  • 78.
    "queryPlanner": {
 "plannerVersion": 1,
 "namespace":"DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor
  • 79.
    "queryPlanner": {
 "plannerVersion": 1,
 "namespace":"DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION
  • 80.
    "multiKeyPaths": {
 "dpt": [],
 "sal":[],
 "name": []
 },
 "isUnique": false,
 "isSparse": false,
 "isPartial": false,
 "indexVersion": 2,
 "direction": "forward",
 "indexBounds": {
 "dpt": [
 "["DE", "DE"]"
 ],
 "sal": [
 "[MaxKey, MinKey]"
 ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION
  • 81.
    "multiKeyPaths": {
 "dpt": [],
 "sal":[],
 "name": []
 },
 "isUnique": false,
 "isSparse": false,
 "isPartial": false,
 "indexVersion": 2,
 "direction": "forward",
 "indexBounds": {
 "dpt": [
 "["DE", "DE"]"
 ],
 "sal": [
 "[MaxKey, MinKey]"
 ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting
  • 82.
    "multiKeyPaths": {
 "dpt": [],
 "sal":[],
 "name": []
 },
 "isUnique": false,
 "isSparse": false,
 "isPartial": false,
 "indexVersion": 2,
 "direction": "forward",
 "indexBounds": {
 "dpt": [
 "["DE", "DE"]"
 ],
 "sal": [
 "[MaxKey, MinKey]"
 ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting Pipeline Reordering: Index used for matching
  • 83.
    "queryPlanner": {
 "plannerVersion": 1,
 "namespace":"DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting Pipeline Reordering: Index used for matching
  • 84.
    "queryPlanner": {
 "plannerVersion": 1,
 "namespace":"DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting Pipeline Reordering: Index used for matching Projection Optimization: Query turned to Covered Query
  • 85.
    "queryPlanner": {
 "plannerVersion": 1,
 "namespace":"DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting Pipeline Reordering: Index used for matching Projection Optimization: Query turned to Covered Query
  • 86.
    DB Land Aggregation Pipelines (1)are one of the easiest ways to work with your data. (2) are highly scalable and optimised for performance. (3) are (much) more capable and powerful than you think!
  • 87.
    1 Alex DE300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 DB Land _id name dpt sal
  • 88.
    1 Alex DE300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 DB Land _id name dpt sal 10 3 1 6 10 5 5 10 8 bid
  • 89.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid
  • 90.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" $match $graphLookup
  • 91.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 92.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 93.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 94.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 95.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid " {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 96.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ]3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 97.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ]3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 98.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { }2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ]3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid " {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 99.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { } 2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid "lvl":1,{ } , db.emps.aggregate([ ]) Bert’s bosses {$match: {name:"Bert"}}, {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 100.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { } 2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid "lvl":1,{ } , 10 Jill UK 500 _id name dpt sal bid {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 101.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { } 2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid "lvl":1,{ } , 10 Jill UK 500 _id name dpt sal bid " {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 102.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid { } 2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid "lvl":1,{ } , 10 Jill UK 500 _id name dpt sal bid "lvl":2,{ } , {$match: {name:"Bert"}}, db.emps.aggregate([ ]) Bert’s bosses {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 103.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid Bert’s bosses { } 2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid "lvl":1,{ } , 10 Jill UK 500 _id name dpt sal bid "lvl":2,{ } , {$match: {name:"Bert"}}, db.emps.aggregate([ ]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 104.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid Bert’s bosses { } 2 Bert DE 100 3 _id name dpt sal bid "bosses":[, ] 3 Cora DE 200 1 _id name dpt sal bid "lvl":0,{ } 1 Alex DE 300 10 _id name dpt sal bid "lvl":1,{ } , 10 Jill UK 500 _id name dpt sal bid "lvl":2,{ } , {$match: {name:"Bert"}}, db.emps.aggregate([ ]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 105.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid Bert’s bosses {$match: {name:"Bert"}}, db.emps.aggregate([ ]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses"
  • 106.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employees bosseswith most {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" ]) db.emps.aggregate([ , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl" $limit$graphLookup $sort
  • 107.
    8 Herb NL600 10 10 Jill UK 500 5 Erik US 400 105 Erik US 400 10 10 Jill UK 500 6 Fred US 300 5 1 Alex DE 300 10 3 Cora DE 200 1 10 Jill UK 50010 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[]}] ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 108.
    8 Herb NL600 10 10 Jill UK 500 5 Erik US 400 105 Erik US 400 10 10 Jill UK 500 6 Fred US 300 5 1 Alex DE 300 10 3 Cora DE 200 1 10 Jill UK 50010 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[]}] ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 109.
    8 Herb NL600 10 10 Jill UK 500 5 Erik US 400 105 Erik US 400 10 10 Jill UK 500 6 Fred US 300 5 1 Alex DE 300 10 3 Cora DE 200 1 10 Jill UK 50010 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[]}] ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 110.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0}[ { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 6 Fred US 300 5 10 Jill UK 500 5 Erik US 400 10 5 Erik US 400 10 10 Jill UK 500 8 Herb NL 600 10 ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 111.
    10 Jill UK50010 Jill UK 50010 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 1 Alex DE 300 10 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0}[ { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 6 Fred US 300 5 10 Jill UK 500 5 Erik US 400 10 5 Erik US 400 10 10 Jill UK 500 8 Herb NL 600 10 ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 112.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0}[ { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 1 Alex DE 300 10 10 Jill UK 500 6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 8 Herb NL 600 10 10 Jill UK 500 ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 113.
    10 Jill UK50010 Jill UK 50010 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0}[ { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 1 Alex DE 300 10 10 Jill UK 500 6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 8 Herb NL 600 10 10 Jill UK 500 ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 114.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} }] ,[ { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, , { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, , 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 1 Alex DE 300 10 10 Jill UK 500 6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 8 Herb NL 600 10 10 Jill UK 500 }] , }] ,}] , ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 115.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} }] ,[ { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, , { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, , 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 1 Alex DE 300 10 10 Jill UK 500 6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 8 Herb NL 600 10 10 Jill UK 500 }] , }] ,}] , ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 116.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid [ 1 Alex DE 300 10{ ,"bosses":[{ ,"lvl":0} }] ,10 Jill UK 500 10 Jill UK 500{ ,"bosses":[]}] 5 Erik US 400 10{ ,"bosses":[{ ,"lvl":0}10 Jill UK 500 }] , 8 Herb NL 600 10{ ,"bosses":[{ ,"lvl":0}10 Jill UK 500 }] ,}] , 2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]}, 4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]}, 6 Fred US 300 5 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},5 Erik US 400 10 10 Jill UK 500 ]}, 7 Gina US 200 5 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},5 Erik US 400 10 10 Jill UK 500 ]}, 3 Cora DE 200 1 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},1 Alex DE 300 10 10 Jill UK 500 ]}, 9 Ivan NL 400 8 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},8 Herb NL 600 10 10 Jill UK 500 ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 117.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid [ 2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]}, 4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]}] The two employees bosseswith most ]) db.emps.aggregate([ , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 118.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl" 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) [ 2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]}, 4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]}] The two employees bosseswith most "bid" "_id""$bid" "bosses"
  • 119.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl" 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employees bosseswith most "bid" "_id""$bid" "bosses"
  • 120.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) "bid" "_id""$bid" "bosses" The two employeesbosses with most "bosses.lvl"
  • 121.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) "bid""_id""$bid" "bosses" The two employeesbosses with most "bosses.lvl"
  • 122.
    , {$sort:{"bosses.leve:-1}}, {$limit:2} {$graphLookup: {from:"emps",startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "emps" "bosses.lvl" "$_id" "_id" "bid"
  • 123.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "bosses.lvl" "$_id" "_id" "bid" "emps" ,
  • 124.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt"
  • 125.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 126.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 127.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}}, $limit$graphLookup $sort$addFields
  • 128.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 129.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 130.
    [{ ,"emps":[], "hdcnt":0}] 9 IvanNL 400 8 [{ ,"emps":[], "hdcnt":0} 7 Gina US 200 5 [{ ,"emps":[], "hdcnt":0} 4 Drew US 200 6 [{ ,"emps":[], "hdcnt":0} 2 Bert DE 100 3 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 8 Herb NL 600 10 9 Ivan NL 400 8 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 6 Fred US 300 5 4 Drew US 200 6 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 131.
    [ 5 ErikUS 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} [{ ,"emps":[], "hdcnt":0} 7 Gina US 200 5 [{ ,"emps":[], "hdcnt":0} 4 Drew US 200 6 [{ ,"emps":[], "hdcnt":0} 2 Bert DE 100 3 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 3 Cora DE 200 1 2 Bert DE 100 3 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 8 Herb NL 600 10 9 Ivan NL 400 8 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 6 Fred US 300 5 4 Drew US 200 6 [ { ,"lvl":1}],{ ,"emps":[{ ,"lvl":0}, "hdcnt":2}, 1 Alex DE 300 10 3 Cora DE 200 1 2 Bert DE 100 3 , 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 132.
    [ 10 JillUK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 3 Cora DE 200 1 2 Bert DE 100 3 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 8 Herb NL 600 10 9 Ivan NL 400 8 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 6 Fred US 300 5 4 Drew US 200 6 [ { ,"lvl":1}],{ ,"emps":[{ ,"lvl":0}, "hdcnt":2}, 1 Alex DE 300 10 3 Cora DE 200 1 2 Bert DE 100 3 , 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 133.
    [ 10 JillUK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 3 Cora DE 200 1 2 Bert DE 100 3 [ { ,"lvl":1}],{ ,"emps":[{ ,"lvl":0}, "hdcnt":2}, 1 Alex DE 300 10 3 Cora DE 200 1 2 Bert DE 100 3 , 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 134.
    {$graphLookup: {from:"emps", startWith:"$bid",connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]}
  • 135.
    {$addFields: {tsal:{$reduce: { input:"$emps", initialValue: 0, in: {$add: ["$$value", "$$this.sal"]}}}}}]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]}
  • 136.
    {$addFields: {tsal:{$reduce: { input:"$emps", initialValue: 0, in: {$add: ["$$value", "$$this.sal"]}}}}}]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]} $limit$graphLookup $sort$addFields
  • 137.
    {$addFields: {tsal:{$reduce: { input:"$emps", initialValue: 0, in: {$add: ["$$value", "$$this.sal"]}}}}}]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]} $addFields $reduce $limit$graphLookup $sort$addFields
  • 138.
    {$addFields: {tsal:{$reduce: { input:"$emps", initialValue: 0, in: {$add: ["$$value", "$$this.sal"]}}}}}]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]}
  • 139.
    {$addFields: {tsal:{$reduce: { input:"$emps", initialValue: 0, in: {$add: ["$$value", "$$this.sal"]}}}}}]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]}
  • 140.
    {$addFields: {tsal:{$reduce: { input:"$emps", initialValue: 0, in: {$add: ["$$value", "$$this.sal"]}}}}}]) {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ "$_id" "_id" "bid" "emps" , "hdcnt" , {$addFields: {hdcnt:{$size:"$emps"}}}, The two employeesbosses with most 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid The two employeesbosses with most [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} }, ]} , "tsal":2700 , "tsal":700
  • 141.
    10 Jill UK500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid
  • 142.
    MongoDB 1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 _id name dpt sal bid
  • 143.
    MongoDB 1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 _id name dpt sal bid Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London loc
  • 144.
    MongoDB 1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
  • 145.
    1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
  • 146.
    Chicago Boston Austin Orlando 1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
  • 147.
    Chicago Boston Austin Orlando ✈ 1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
  • 148.
    Chicago Boston Austin Orlando $ 1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
  • 149.
    Chicago Boston Austin Orlando $ 1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
  • 150.
    Chicago Boston Austin Orlando $ 1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
  • 151.
    Chicago Boston Austin Orlando $ 1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
  • 152.
    Chicago Boston Austin Orlando 1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc $
  • 153.
    Chicago Boston Austin Orlando ✈ 1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
  • 154.
    Chicago Boston Austin Orlando 1 Alex DE300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 Munich Hamburg Essen Chicago Boston Orlando Austin Utrecht Arnheim London _id name dpt sal bid loc
  • 155.
  • 156.
    Chicago Boston Austin Orlando Boston 980 Chicago Boston2000 Austin Boston 1300 Orlando Chicago 980 Boston Chicago 1150 Austin Chicago 1200 Orlando Austin 2000 Boston Austin 1150 Chicago Austin 1100 Orlando Orlando 1300 Boston Orlando 1200 Chicago Orlando 1100 Austin start enddist
  • 157.
    Orlando 1300 BostonBoston980 ChicagoChicago 1200 OrlandoOrlando 1100 AustinAustin 2000 BostonBoston 980 ChicagoChicago 1150 AustinAustin 1100 OrlandoOrlando 1300 BostonBoston 1300 OrlandoOrlando 1100 AustinAustin 1150 ChicagoChicago 980 BostonBoston 1300 OrlandoOrlando 1200 ChicagoChicago 1150 AustinAustin 2000 BostonBoston 2000 AustinAustin 1100 OrlandoOrlando 1200 ChicagoChicago 980 BostonBoston 2000 AustinAustin 1150 ChicagoChicago 1200 Orlando …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})] start enddist Boston 980 Chicago Boston 2000 Austin Boston 1300 Orlando Chicago 980 Boston Chicago 1150 Austin Chicago 1200 Orlando Austin 2000 Boston Austin 1150 Chicago Austin 1100 Orlando Orlando 1300 Boston Orlando 1200 Chicago Orlando 1100 Austin Chicago Boston Austin Orlando $limit$graphLookup $sort...
  • 158.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] 5280Boston 980 Chicago Chicago 1200 Orlando Orlando 1100 Austin Austin 2000 Boston 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston 4530Boston 1300 Orlando Orlando 1100 Austin Austin 1150 Chicago Chicago 980 Boston 5650Boston 1300 Orlando Orlando 1200 Chicago Chicago 1150 Austin Austin 2000 Boston 5280Boston 2000 Austin Austin 1100 Orlando Orlando 1200 Chicago Chicago 980 Boston 5650Boston 2000 Austin Austin 1150 Chicago Chicago 1200 Orlando Orlando 1300 Boston start enddist start enddist start enddist start enddist tdist Chicago Boston Austin Orlando
  • 159.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] 5280Boston 980 Chicago Chicago 1200 Orlando Orlando 1100 Austin Austin 2000 Boston 4530Boston 1300 Orlando Orlando 1100 Austin Austin 1150 Chicago Chicago 980 Boston 5650Boston 1300 Orlando Orlando 1200 Chicago Chicago 1150 Austin Austin 2000 Boston 5280Boston 2000 Austin Austin 1100 Orlando Orlando 1200 Chicago Chicago 980 Boston 5650Boston 2000 Austin Austin 1150 Chicago Chicago 1200 Orlando Orlando 1300 Boston start enddist start enddist start enddist start enddist tdist Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
  • 160.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] start enddist start enddist start enddist start enddist tdist Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
  • 161.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
  • 162.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston ✈
  • 163.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston $
  • 164.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston $
  • 165.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston $
  • 166.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston $
  • 167.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston $
  • 168.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston ✈
  • 169.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] Chicago Boston Austin Orlando 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
  • 170.
    …,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",
 dpthField:"lvl", as:"routes"}}, …,{$sort:{"tdist":1}}, {$limit:1})] 4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
  • 177.
  • 180.
  • 181.
  • 182.
  • 183.
    MongoDB _id name dptsal expertise
  • 184.
    MongoDB _id name dptsal expertise 5 results for mongodb Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔
  • 185.
    3 results fororacle Fred location: US salary: 300 expertise: Oracle, Cobol Gina location: US salary: 200 expertise: Oracle, Pascal Ivan location: NL salary: 400 expertise: Oracle, Fortran Search | EmpView Location All US NL ✔ Expertise All Oracle Cobol Pascal Fortran ✔ Salary All 100 - 200 200 - 400 ✔ oracle (2) (1) (3) (1) (1) (1) (1) (2) https://www.awesomeempview.com/search/f?type=all&key… MongoDB _id name dpt sal expertise
  • 186.
    MongoDB _id name dptsal expertise Alex location: DE salary: 300 expertise: MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb
  • 187.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb _id name dpt sal expertise
  • 188.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb _id name dpt sal expertise db.emps.aggregate([
 { $match: { $text : { $search : "mongodb" }}},
 { $sortByCount: "$dpt"}
 ])
  • 189.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb _id name dpt sal expertise db.emps.aggregate([
 { $match: { $text : { $search : "mongodb" }}},
 { $sortByCount: "$dpt"}
 ])
  • 190.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb {"_id":"DE", "count":3}, {"_id":"NL", "count":1}, {"_id":"US", "count":1} _id name dpt sal expertise db.emps.aggregate([
 { $match: { $text : { $search : "mongodb" }}},
 { $sortByCount: "$dpt"}
 ])
  • 191.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb db.emps.aggregate( [
 {$match: { $text : {$search : "mongodb" }}},
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ]) _id name dpt sal expertise {"_id":"MongoDB","count":5}, {"_id":"Java","count":2}, {"_id":"Ruby","count":2}, {"_id":"Scala","count":1}
  • 192.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb db.emps.aggregate([
 {$match: { $text : {$search : "mongodb" }}},
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]) {"_id":100,"count":2}, {"_id":201,"count":2}, {"_id":401,"count":1} _id name dpt sal expertise
  • 193.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb db.emps.aggregate([
 {$match: { $text : {$search : "mongodb" }}},
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity],
 output: {
 count: {$sum: 1},
 matches: {$push: "$$CURRENT"}
 }}}
 ]) {"_id":100,"count":2,"matches":[ ]}, {"_id":201,"count":2,"matches":[ ]}, {"_id":401,"count":1,"matches":[ ]} _id name dpt sal expertise
  • 194.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb db.emps.aggregate([
 {$match: { $text : {$search : "mongodb" }}},
 {$bucketAuto: {
 groupBy: "$sal",
 buckets: 4}}
 ]) {"_id":{"min":100,"max":200}, "count":1}, {"_id":{"min":200,"max":300}, "count":1}, {"_id":{"min":300,"max":400}, “count":1}, {"_id":{"min":400,"max":600}, "count":2} _id name dpt sal expertise
  • 195.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb db.emps.aggregate([
 {$match: { $text : {$search :
 {$facet: {
 "Location": [
 {$sortByCount: "$dpt"}
 ],
 "Expertise":[
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ],
 "Salary":[
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]}}]) {"Location":[
 {"_id":"DE","count":3},
 {"_id":"NL","count":1},
 {"_id":"US","count":1}],
 
 "Expertise":[
 {"_id":"MongoDB","count":5},
 {"_id":"Java","count":2},
 {"_id":"Ruby","count":2},
 {"_id":"Scala","count":1}],
 
 "Salary":[
 {"_id":100,"count":2},
 {"_id":201,"count":2},
 {"_id":401,"count":1}]} _id name dpt sal expertise }}},"mongodb"
  • 196.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb {"Location":[
 {"_id":"DE","count":3},
 {"_id":"NL","count":1},
 {"_id":"US","count":1}],
 
 "Expertise":[
 {"_id":"MongoDB","count":5},
 {"_id":"Java","count":2},
 {"_id":"Ruby","count":2},
 {"_id":"Scala","count":1}],
 
 "Salary":[
 {"_id":100,"count":2},
 {"_id":201,"count":2},
 {"_id":401,"count":1}]} _id name dpt sal expertise db.emps.aggregate([
 {$match: { $text : {$search :
 {$facet: {
 "Location": [
 {$sortByCount: "$dpt"}
 ],
 "Expertise":[
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ],
 "Salary":[
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]}}]) }}},"mongodb"
  • 197.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb {"Location":[
 {"_id":"DE","count":3},
 {"_id":"NL","count":1},
 {"_id":"US","count":1}],
 
 "Expertise":[
 {"_id":"MongoDB","count":5},
 {"_id":"Java","count":2},
 {"_id":"Ruby","count":2},
 {"_id":"Scala","count":1}],
 
 "Salary":[
 {"_id":100,"count":2},
 {"_id":201,"count":2},
 {"_id":401,"count":1}]} _id name dpt sal expertise db.emps.aggregate([
 {$match: { $text : {$search :
 {$facet: {
 "Location": [
 {$sortByCount: "$dpt"}
 ],
 "Expertise":[
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ],
 "Salary":[
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]}}]) }}},"mongodb"
  • 198.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb {"Location":[
 {"_id":"DE","count":3},
 {"_id":"NL","count":1},
 {"_id":"US","count":1}],
 
 "Expertise":[
 {"_id":"MongoDB","count":5},
 {"_id":"Java","count":2},
 {"_id":"Ruby","count":2},
 {"_id":"Scala","count":1}],
 
 "Salary":[
 {"_id":100,"count":2},
 {"_id":201,"count":2},
 {"_id":401,"count":1}]} _id name dpt sal expertise db.emps.aggregate([
 {$match: { $text : {$search :
 {$facet: {
 "Location": [
 {$sortByCount: "$dpt"}
 ],
 "Expertise":[
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ],
 "Salary":[
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]}}]) }}},""mongodb" "ruby""
  • 199.
    Alex location: DE salary: 300 expertise:MongoDB, Ruby Bert location: DE salary: 100 expertise: MongoDB, Java Cora location: DE salary: 200 expertise: MongoDB, Java Erik location: US salary: 400 expertise: MongoDB, Ruby Herb location: NL salary: 600 expertise: MongoDB, Scala Location All DE NL Salary All 100 - 200 200 - 400 400 - 600 Expertise All MongoDB Java Scala ✔ (1) (2) (1) (2) (2) (1) ✔ 3( ) ( )5 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 5 results for mongodb _id name dpt sal expertise db.emps.aggregate([
 {$match: { $text : {$search :
 {$facet: {
 "Location": [
 {$sortByCount: "$dpt"}
 ],
 "Expertise":[
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ],
 "Salary":[
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]}}]) }}},""mongodb" "ruby"" {"Location":[
 {"_id":"DE","count":1},
 {"_id":"US","count":1}],
 
 "Expertise":[
 {"_id":"MongoDB","count":2},
 {"_id":"Ruby","count":2}],
 
 "Salary":[
 {"_id":201,"count":2}]}
  • 200.
    MongoDB Alex location: DE salary: 300 expertise:MongoDB, Ruby Erik location: US salary: 400 expertise: MongoDB, Ruby Location All DE Salary All 200 - 400 Expertise All MongoDB ✔ (2) ✔ 1( ( )2 Ruby (2) US (1) ✔ https://www.awesomeempview.com/search/f?type=all&key… Search | EmpView mongodb 2 results for mongodb _id name dpt sal expertise db.emps.aggregate([
 {$match: { $text : {$search :
 {$facet: {
 "Location": [
 {$sortByCount: "$dpt"}
 ],
 "Expertise":[
 {$unwind: "$expertise"},
 {$sortByCount: "$expertise"}
 ],
 "Salary":[
 {$bucket: {
 groupBy: "$sal",
 boundaries: [100, 201, 401, 601, Infinity]}}
 ]}}]) }}},""mongodb" "ruby"" {"Location":[
 {"_id":"DE","count":1},
 {"_id":"US","count":1}],
 
 "Expertise":[
 {"_id":"MongoDB","count":2},
 {"_id":"Ruby","count":2}],
 
 "Salary":[
 {"_id":201,"count":2}]})
  • 201.
  • 202.
  • 203.
  • 204.
    PL Land nats = nats.(nats. {|n| nats. (n-1) . (1) . {|p| n % p != 0} . }) drop take map all? mapzip [1,2,3,4,5,6,7,8,9,10] Ruby
  • 205.
    PL Land [[1, true], [2, true ], [3, true ], [4, false], [5, true ], [6, false], [7, true ], [8, false], [9, false], [10,false]] nats = nats. (nats. {|n| nats. (n-1) . (1) . {|p| n % p != 0} . }) drop take map all? mapzip [1,2,3,4,5,6,7,8,9,10] Ruby
  • 206.
  • 207.
  • 208.
  • 209.
    PL Land drop take map all? map$zip $range: [1,11, 1] ["A", "B", "C"] [10, 20, 30] Ruby
  • 210.
    PL Land drop take map all? map$zip $range: [1,11, 1] ["A", "B", "C"] [10, 20, 30] [["A",10], ["B",20], ["C",30]] Ruby
  • 211.
  • 212.
  • 213.
  • 214.
  • 215.
  • 216.
  • 217.
    $let: {vars: {nats:{ }}, in: {
 : {inputs: ["$$nats", {
 : {input: "$$nats", as: "n", in: {
 : [{
 : {input: { : [{ : ["$$nats", {$subtract: ["$$n", 1]}]}, 1, {$size: "$$nats"}]}, as: "p", in: { $ne: [{$mod: ["$$n", "$$p"]}, 0]}}}]}}}]}}} PL Land $slice $slice $map $allElementsTrue $map $zip : [1, 11, 1]$range Aggregation Pipeline
  • 218.
    $let: {vars: {nats:{ }}, in: {
 : {inputs: ["$$nats", {
 : {input: "$$nats", as: "n", in: {
 : [{
 : {input: { : [{ : ["$$nats", {$subtract: ["$$n", 1]}]}, 1, {$size: "$$nats"}]}, as: "p", in: { $ne: [{$mod: ["$$n", "$$p"]}, 0]}}}]}}}]}}} PL Land $slice $slice $map $allElementsTrue $map $zip : [1, 11, 1]$range Aggregation Pipeline $allElementsTrue$map$slice$slice $map $range $zip
  • 219.
    MongoDB PL Land $let: {vars:{nats: { }}, in: {
 : {inputs: ["$$nats", {
 : {input: "$$nats", as: "n", in: {
 : [{
 : {input: { : [{ : ["$$nats", {$subtract: ["$$n", 1]}]}, 1, {$size: "$$nats"}]}, as: "p", in: { $ne: [{$mod: ["$$n", "$$p"]}, 0]}}}]}}}]}}} $slice $slice $map $allElementsTrue $map $zip : [1, 11, 1]$range Aggregation Pipeline $allElementsTrue$map$slice$slice $map $range $zip
  • 220.
    MongoDB PL Land [[1, true], [2, true ], [3, true ], [4, false], [5, true ], [6, false], [7, true ], [8, false], [9, false], [10,false]] $let: {vars: {nats: { }}, in: {
 : {inputs: ["$$nats", {
 : {input: "$$nats", as: "n", in: {
 : [{
 : {input: { : [{ : ["$$nats", {$subtract: ["$$n", 1]}]}, 1, {$size: "$$nats"}]}, as: "p", in: { $ne: [{$mod: ["$$n", "$$p"]}, 0]}}}]}}}]}}} $slice $slice $map $allElementsTrue $map $zip : [1, 11, 1]$range Aggregation Pipeline $allElementsTrue$map$slice$slice $map $range $zip
  • 221.
  • 222.
  • 223.
    $indexStats $stdDevSamp $stdDevPop $sqrt $abs $log $log10 $ln $pow $exp $trunc $ceil $floor $arrayElemAt $concatArrays $isArray $filter $avg $min $max $sum $stdDevPop $stdDevSamp $split $indexOf $reduce $reverseArray $indexOfArray $type $isoWeekYear $isoDayOfWeek $isoWeek $in $switch $count $replaceRoot $addFields $graphLookup$facet $bucket $bucketAuto $sortByCount $out $redact $setEquals $setIntersection$setUnion $setDifference $setIsSubset $anyElementTrue $literal $size $geoNear $millisecond $concat $project $match $limit $skip $unwind $group $sort $and $or $not $cmp $eq $gt $gte $lt $lte $ne $abs $add $ceil $divide $mod $multiply $subtract $toLower $toUpper $strcasecmp $meta $let $dayOfYear $dayOfMonth $dayOfWeek $year $month $week $hour $minute $second $millisecond $dateToString $cond $ifNull $first $last $push $addToSet $indexOfBytes $indexOfCP $strLenBytes $strLenCP $substrBytes $substrCP $slice $map $allElementsTrue $zip $range $sample$lookup $dateToString $collStats
  • 224.
    3.0 3.4 3.2 2.6 2.4 2.2 $indexStats $stdDevSamp $stdDevPop $sqrt $abs $log $log10 $ln $pow $exp $trunc $ceil $floor $arrayElemAt $concatArrays $isArray $filter $avg $min $max $sum $stdDevPop $stdDevSamp $out $redact $setEquals $setIntersection$setUnion $setDifference $setIsSubset$anyElementTrue $literal $size $geoNear $millisecond $concat $project $match $limit $skip $unwind $group $sort $and $or $not $cmp $eq $gt $gte $lt $lte $ne $abs $add $ceil $divide $mod $multiply $subtract $toLower $toUpper $strcasecmp $meta $let $dayOfYear $dayOfMonth $dayOfWeek $year $month $week $hour $minute $second $millisecond $dateToString $cond $ifNull $first $last $push $addToSet $slice $map $allElementsTrue $sample$lookup $dateToString $split $indexOf $reduce $reverseArray $indexOfArray $type $isoWeekYear $isoDayOfWeek $isoWeek $in $switch $count $replaceRoot $addFields $graphLookup $facet $bucket $bucketAuto $sortByCount $indexOfBytes $indexOfCP $strLenBytes $strLenCP $substrBytes $substrCP $zip $range $collStats
  • 225.
    2.4 $geoNear $millisecond$concat 2.2 $avg $min $max $sum $stdDevPop $stdDevSamp $project $match $limit $skip $unwind $group $sort $and $or $not $cmp $eq $gt $gte $lt $lte $ne $abs $add $ceil $divide $mod $multiply $subtract $toLower $toUpper $strcasecmp $meta $let $dayOfYear $dayOfMonth $dayOfWeek $year $month $week $hour $minute $second $millisecond $dateToString $cond $ifNull $first $last $push $addToSet $map 2.6 $out $redact $setEquals $setIntersection$setUnion $setDifference $setIsSubset $anyElementTrue $literal $size $allElementsTrue 3.2$indexStats $stdDevSamp $stdDevPop $sqrt $abs $log $log10 $ln $pow $exp $trunc $ceil $floor $arrayElemAt $concatArrays $isArray $filter $slice $sample$lookup 3.0$dateToString 3.4 $indexOf $indexOfArray $type $isoWeekYear $in $switch $count $replaceRoot $addFields $graphLookup $facet $bucket $bucketAuto $sortByCount $indexOfBytes $indexOfCP$substrBytes $substrCP $zip $range $split $reduce $reverseArray $isoWeekYear $isoDayOfWeek $isoWeek $strLenBytes $strLenCP $collStats Data-Parallel 
 Pipeline Execution Shard 1 Shard 2 Shard 3 Shard N mongos Q Pipeline
 Optimisations Pipeline Projection Optimization Pipeline Coalescence Optimization . . . Pipeline Reordering Pipeline Combining
  • 226.
    2.4 $geoNear $millisecond$concat 2.2 $avg $min $max $sum $stdDevPop $stdDevSamp $project $match $limit $skip $unwind $group $sort $and $or $not $cmp $eq $gt $gte $lt $lte $ne $abs $add $ceil $divide $mod $multiply $subtract $toLower $toUpper $strcasecmp $meta $let $dayOfYear $dayOfMonth $dayOfWeek $year $month $week $hour $minute $second $millisecond $dateToString $cond $ifNull $first $last $push $addToSet $map 2.6 $out $redact $setEquals $setIntersection$setUnion $setDifference $setIsSubset $anyElementTrue $literal $size $allElementsTrue 3.2$indexStats $stdDevSamp $stdDevPop $sqrt $abs $log $log10 $ln $pow $exp $trunc $ceil $floor $arrayElemAt $concatArrays $isArray $filter $slice $sample$lookup 3.0$dateToString 3.4 $indexOf $indexOfArray $type $isoWeekYear $in $switch $count $replaceRoot $addFields $graphLookup $facet $bucket $bucketAuto $sortByCount $indexOfBytes $indexOfCP$substrBytes $substrCP $zip $range $split $reduce $reverseArray $isoWeekYear $isoDayOfWeek $isoWeek $strLenBytes $strLenCP $collStats
  • 227.
    Aggregation Pipelines (1) areone of the easiest ways to work with your data. (2) are highly scalable and optimised for performance. (3) are (much) more capable and powerful than you think!
  • 229.
    Use the ForceAggregation Pipelines! And take control over your Data.
  • 231.
    ASK THE EXPERTS Getyour technical questions answered By appointment only – register in one of two ways: In person Online Come to the MongoDB Team Stand on the ground floor calendly.com/mongodb