MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

Preview:

Citation preview

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

34

3 13

646

36

4

MongoDB Aggregation Framework

$sum$match

A Highly Composable Compute Pipeline

34

3 13

646

36

4

MongoDB Aggregation Framework

$sum$match

A Highly Composable Compute Pipeline

34

3 13

646

36

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 programminglanguages, since programs can be identified with λ-terms. However, if one goes further anduses βη-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 theapplicability of theoretical results. In this paper we introduce calculi based on a categoricalsemantics for computations, that provide a correct basis for proving equivalence of programs,for a wide range of notions of computation.

IntroductionThis paper is about logics for reasoning about programs, in particular for proving equivalence ofprograms. Following a consolidated tradition in theoretical computer science we identify programswith the closed λ-terms, possibly containing extra constants, corresponding to some features ofthe programming language under consideration. There are three semantic-based approaches toproving equivalence of programs:

• The operational approach starts from an operational semantics, e.g. a partial functionmapping every program (i.e. closed term) to its resulting value (if any), which induces acongruence relation on open terms called operational equivalence (see e.g. [Plo75]). Thenthe problem is to prove that two terms are operationally equivalent.

• The denotational approach gives an interpretation of the (programming) language in amathematical structure, the intended model. Then the problem is to prove that two termsdenote the same object in the intended model.

• The logical approach gives a class of possible models for the (programming) language.Then the problem is to prove that two terms denotes the same object in all possible models.

The operational and denotational approaches give only a theory: the operational equivalence ≈or the set Th of formulas valid in the intended model respectively. On the other hand, the logicalapproach gives a consequence relation ⊢, namely Ax ⊢ A iff the formula A is true in all modelsof the set of formulas Ax, which can deal with different programming languages (e.g. functional,imperative, non-deterministic) in a rather uniform way, by simply changing the set of axiomsAx, and possibly extending the language with new constants. Moreover, the relation ⊢ is oftensemidecidable, so it is possible to give a sound and complete formal system for it, while Th and ≈are semidecidable only in oversimplified cases.

We do not take as a starting point for proving equivalence of programs the theory of βη-conversion, which identifies the denotation of a program (procedure) of type A → B with atotal function from A to B, since this identification wipes out completely behaviours like non-termination, non-determinism or side-effects, that can be exhibited by real programs. Instead, weproceed as follows:

1. We take category theory as a general theory of functions and develop on top a categoricalsemantics of computations based on monads.

∗Research partially supported by EEC Joint Collaboration Contract # ST2J-0374-C(EDB).

1

A Highly Composable Compute Pipeline

34

3 13

646

36

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 programminglanguages, since programs can be identified with λ-terms. However, if one goes further anduses βη-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 theapplicability of theoretical results. In this paper we introduce calculi based on a categoricalsemantics for computations, that provide a correct basis for proving equivalence of programs,for a wide range of notions of computation.

IntroductionThis paper is about logics for reasoning about programs, in particular for proving equivalence ofprograms. Following a consolidated tradition in theoretical computer science we identify programswith the closed λ-terms, possibly containing extra constants, corresponding to some features ofthe programming language under consideration. There are three semantic-based approaches toproving equivalence of programs:

• The operational approach starts from an operational semantics, e.g. a partial functionmapping every program (i.e. closed term) to its resulting value (if any), which induces acongruence relation on open terms called operational equivalence (see e.g. [Plo75]). Thenthe problem is to prove that two terms are operationally equivalent.

• The denotational approach gives an interpretation of the (programming) language in amathematical structure, the intended model. Then the problem is to prove that two termsdenote the same object in the intended model.

• The logical approach gives a class of possible models for the (programming) language.Then the problem is to prove that two terms denotes the same object in all possible models.

The operational and denotational approaches give only a theory: the operational equivalence ≈or the set Th of formulas valid in the intended model respectively. On the other hand, the logicalapproach gives a consequence relation ⊢, namely Ax ⊢ A iff the formula A is true in all modelsof the set of formulas Ax, which can deal with different programming languages (e.g. functional,imperative, non-deterministic) in a rather uniform way, by simply changing the set of axiomsAx, and possibly extending the language with new constants. Moreover, the relation ⊢ is oftensemidecidable, so it is possible to give a sound and complete formal system for it, while Th and ≈are semidecidable only in oversimplified cases.

We do not take as a starting point for proving equivalence of programs the theory of βη-conversion, which identifies the denotation of a program (procedure) of type A → B with atotal function from A to B, since this identification wipes out completely behaviours like non-termination, non-determinism or side-effects, that can be exhibited by real programs. Instead, weproceed as follows:

1. We take category theory as a general theory of functions and develop on top a categoricalsemantics of computations based on monads.

∗Research partially supported by EEC Joint Collaboration Contract # ST2J-0374-C(EDB).

1

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

34

3 13

646

36

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 programminglanguages, since programs can be identified with λ-terms. However, if one goes further anduses βη-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 theapplicability of theoretical results. In this paper we introduce calculi based on a categoricalsemantics for computations, that provide a correct basis for proving equivalence of programs,for a wide range of notions of computation.

IntroductionThis paper is about logics for reasoning about programs, in particular for proving equivalence ofprograms. Following a consolidated tradition in theoretical computer science we identify programswith the closed λ-terms, possibly containing extra constants, corresponding to some features ofthe programming language under consideration. There are three semantic-based approaches toproving equivalence of programs:

• The operational approach starts from an operational semantics, e.g. a partial functionmapping every program (i.e. closed term) to its resulting value (if any), which induces acongruence relation on open terms called operational equivalence (see e.g. [Plo75]). Thenthe problem is to prove that two terms are operationally equivalent.

• The denotational approach gives an interpretation of the (programming) language in amathematical structure, the intended model. Then the problem is to prove that two termsdenote the same object in the intended model.

• The logical approach gives a class of possible models for the (programming) language.Then the problem is to prove that two terms denotes the same object in all possible models.

The operational and denotational approaches give only a theory: the operational equivalence ≈or the set Th of formulas valid in the intended model respectively. On the other hand, the logicalapproach gives a consequence relation ⊢, namely Ax ⊢ A iff the formula A is true in all modelsof the set of formulas Ax, which can deal with different programming languages (e.g. functional,imperative, non-deterministic) in a rather uniform way, by simply changing the set of axiomsAx, and possibly extending the language with new constants. Moreover, the relation ⊢ is oftensemidecidable, so it is possible to give a sound and complete formal system for it, while Th and ≈are semidecidable only in oversimplified cases.

We do not take as a starting point for proving equivalence of programs the theory of βη-conversion, which identifies the denotation of a program (procedure) of type A → B with atotal function from A to B, since this identification wipes out completely behaviours like non-termination, non-determinism or side-effects, that can be exhibited by real programs. Instead, weproceed as follows:

1. We take category theory as a general theory of functions and develop on top a categoricalsemantics of computations based on monads.

∗Research partially supported by EEC Joint Collaboration Contract # ST2J-0374-C(EDB).

1

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 […]

RubyModule Enumerable:collect, select, group_by, …

C# / LINQIEnumerable<T>:Select, Where, GroupBy, …

JavaStream<T>:collect, filter, groupingBy, …

MongoDBAggregation Framework:$project, $match, $group, …

map, filter, group, …

HaskellModule Data.List:

A Highly Composable Compute Pipeline

34

3 13

646

36

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!

A Highly Composable Compute Pipeline

34

3 13

646

36

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 3002 Bert DE 1003 Cora DE 2004 Drew US 2005 Erik US 4006 Fred US 3007 Gina US 2008 Herb NL 6009 Ivan NL 40010 Jill UK 500

ID NAME DPT SAL

The two top paid employees per departement

1 Alex DE 3003 Cora DE 200

DE

US5 Erik US 4006 Fred US 300

NL8 Herb NL 6009 Ivan NL 400

UK

10 Jill UK 500

DB Land

1 Alex DE 3002 Bert DE 1003 Cora DE 2004 Drew US 2005 Erik US 4006 Fred US 3007 Gina US 2008 Herb NL 6009 Ivan NL 40010 Jill UK 500

ID NAME DPT SAL

The two top paid employees per departement

1 Alex DE 3003 Cora DE 200

DE

US5 Erik US 4006 Fred US 300

NL8 Herb NL 6009 Ivan NL 400

UK

10 Jill UK 500

DB Land

1 Alex DE 3002 Bert DE 1003 Cora DE 2004 Drew US 2005 Erik US 4006 Fred US 3007 Gina US 2008 Herb NL 6009 Ivan NL 40010 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 3002 Bert DE 1003 Cora DE 2004 Drew US 2005 Erik US 4006 Fred US 3007 Gina US 2008 Herb NL 6009 Ivan NL 40010 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 3003 Cora DE 2005 Erik US 4006 Fred US 3008 Herb NL 6009 Ivan NL 40010 Jill UK 500

ID NAME DPT SAL

DB Land

1 Alex DE 3002 Bert DE 1003 Cora DE 2004 Drew US 2005 Erik US 4006 Fred US 3007 Gina US 2008 Herb NL 6009 Ivan NL 40010 Jill UK 500

ID NAME DPT SAL

The two top paid employees per departement

1 Alex DE 3003 Cora DE 2005 Erik US 4006 Fred US 3008 Herb NL 6009 Ivan NL 40010 Jill UK 500

ID NAME DPT SAL1 Alex DE 3003 Cora DE 200

DE

US5 Erik US 4006 Fred US 300

NL8 Herb NL 6009 Ivan NL 400

UK

10 Jill UK 500

?

DB Land

1 Alex DE 3002 Bert DE 1003 Cora DE 2004 Drew US 2005 Erik US 4006 Fred US 3007 Gina US 2008 Herb NL 6009 Ivan NL 40010 Jill UK 500

ID NAME DPT SAL

The two top paid employees per departement

1 Alex DE 3003 Cora DE 2005 Erik US 4006 Fred US 3008 Herb NL 6009 Ivan NL 40010 Jill UK 500

ID NAME DPT SAL1 Alex DE 3003 Cora DE 200

DE

US5 Erik US 4006 Fred US 300

NL8 Herb NL 6009 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 3002 Bert DE 1003 Cora DE 2004 Drew US 2005 Erik US 4006 Fred US 3007 Gina US 2008 Herb NL 6009 Ivan NL 40010 Jill UK 500

ID NAME DPT SAL

DB LandPL Land

PL Land

1 Alex DE 3002 Bert DE 1003 Cora DE 2004 Drew US 2005 Erik US 4006 Fred US 3007 Gina US 2008 Herb NL 6009 Ivan NL 40010 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_bysort_by

take

Ruby

DB Land

PL Land

emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect

group_bysort_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_bysort_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_bysort_by

take

]

]]

]]

Ruby

DB Land

PL Land

emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}takecollect

group_bysort_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 3003 Cora DE 200

DE

US5 Erik US 4006 Fred US 300

NL8 Herb NL 6009 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_bysort_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 3003 Cora DE 200

DE

US5 Erik US 4006 Fred US 300

NL8 Herb NL 6009 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 3003 Cora DE 200

DE

US5 Erik US 4006 Fred US 300

NL8 Herb NL 6009 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_bysort_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":"Exceededmemorylimitfor$group,butdidn'tallowexternalsort.PassallowDiskUse:truetooptin."

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, "sal": 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 }, "queryPlanner": {

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 }, "queryPlanner": {

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" } } } }, { "$project": {

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" } } } }, { "$project": {

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]" ] } } }, "rejectedPlans": []

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]" ] } } }, "rejectedPlans": []

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]" ] } } }, "rejectedPlans": []

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

Pipeline Reordering:

Index used

Projection Optimization:

Query turned to

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 3002 Bert DE 1003 Cora DE 2004 Drew US 2005 Erik US 4006 Fred US 3007 Gina US 2008 Herb NL 6009 Ivan NL 40010 Jill UK 500

DB Land

_id name dpt sal

1 Alex DE 3002 Bert DE 1003 Cora DE 2004 Drew US 2005 Erik US 4006 Fred US 3007 Gina US 2008 Herb NL 6009 Ivan NL 40010 Jill UK 500

DB Land

_id name dpt sal103161055108

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

db.emps.aggregate([

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 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 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 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 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 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 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 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 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 11 Alex DE 300 106 Fred US 300 510 Jill UK 5005 Erik US 400 105 Erik US 400 1010 Jill UK 5008 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 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 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 11 Alex DE 300 106 Fred US 300 510 Jill UK 5005 Erik US 400 105 Erik US 400 1010 Jill UK 5008 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 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 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 101 Alex DE 300 10 10 Jill UK 5006 Fred US 300 5 5 Erik US 400 1010 Jill UK 5005 Erik US 400 10 10 Jill UK 5005 Erik US 400 10 10 Jill UK 50010 Jill UK 5008 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 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 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 101 Alex DE 300 10 10 Jill UK 5006 Fred US 300 5 5 Erik US 400 1010 Jill UK 5005 Erik US 400 10 10 Jill UK 5005 Erik US 400 10 10 Jill UK 50010 Jill UK 5008 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 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 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 5001 Alex DE 300 10 10 Jill UK 5006 Fred US 300 5 5 Erik US 400 10 10 Jill UK 50010 Jill UK 5005 Erik US 400 10 10 Jill UK 5005 Erik US 400 10 10 Jill UK 50010 Jill UK 5008 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 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 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 5001 Alex DE 300 10 10 Jill UK 5006 Fred US 300 5 5 Erik US 400 10 10 Jill UK 50010 Jill UK 5005 Erik US 400 10 10 Jill UK 5005 Erik US 400 10 10 Jill UK 50010 Jill UK 5008 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 610 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 103 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 59 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 103 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 59 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 103 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 59 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 103 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 59 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 103 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 59 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 103 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 59 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 103 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 59 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 103 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 59 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 103 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 59 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 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

_id name dpt sal bid

MongoDB

1 Alex DE 300 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

_id name dpt sal bidMunichHamburgEssen

ChicagoBostonOrlandoAustinUtrechtArnheimLondon

loc

MongoDB

1 Alex DE 300 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

MunichHamburgEssen

ChicagoBostonOrlandoAustinUtrechtArnheimLondon

_id name dpt sal bid loc

1 Alex DE 300 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

MunichHamburgEssen

ChicagoBostonOrlandoAustinUtrechtArnheimLondon

_id name dpt sal bid loc

Chicago Boston

Austin

Orlando

1 Alex DE 300 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

MunichHamburgEssen

ChicagoBostonOrlandoAustinUtrechtArnheimLondon

_id name dpt sal bid loc

Chicago Boston

Austin

Orlando

1 Alex DE 300 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

MunichHamburgEssen

ChicagoBostonOrlandoAustinUtrechtArnheimLondon

_id name dpt sal bid loc

Chicago Boston

Austin

Orlando

$

1 Alex DE 300 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

MunichHamburgEssen

ChicagoBostonOrlandoAustinUtrechtArnheimLondon

_id name dpt sal bid loc

Chicago Boston

Austin

Orlando

$1 Alex DE 300 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

MunichHamburgEssen

ChicagoBostonOrlandoAustinUtrechtArnheimLondon

_id name dpt sal bid loc

Chicago Boston

Austin

Orlando

$

1 Alex DE 300 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

MunichHamburgEssen

ChicagoBostonOrlandoAustinUtrechtArnheimLondon

_id name dpt sal bid loc

Chicago Boston

Austin

Orlando

$

1 Alex DE 300 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

MunichHamburgEssen

ChicagoBostonOrlandoAustinUtrechtArnheimLondon

_id name dpt sal bid loc

Chicago Boston

Austin

Orlando

1 Alex DE 300 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

MunichHamburgEssen

ChicagoBostonOrlandoAustinUtrechtArnheimLondon

_id name dpt sal bid loc

$

Chicago Boston

Austin

Orlando

1 Alex DE 300 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

MunichHamburgEssen

ChicagoBostonOrlandoAustinUtrechtArnheimLondon

_id name dpt sal bid loc

Chicago Boston

Austin

Orlando

1 Alex DE 300 102 Bert DE 100 33 Cora DE 200 14 Drew US 200 65 Erik US 400 106 Fred US 300 57 Gina US 200 58 Herb NL 600 109 Ivan NL 400 810 Jill UK 500

MunichHamburgEssen

ChicagoBostonOrlandoAustinUtrechtArnheimLondon

_id name dpt sal bid loc

Chicago Boston

Austin

Orlando

Chicago Boston

Austin

Orlando

Boston 980 ChicagoBoston 2000 AustinBoston 1300 OrlandoChicago 980 BostonChicago 1150 AustinChicago 1200 OrlandoAustin 2000 BostonAustin 1150 ChicagoAustin 1100 OrlandoOrlando 1300 BostonOrlando 1200 ChicagoOrlando 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 ChicagoBoston 2000 AustinBoston 1300 OrlandoChicago 980 BostonChicago 1150 AustinChicago 1200 OrlandoAustin 2000 BostonAustin 1150 ChicagoAustin 1100 OrlandoOrlando 1300 BostonOrlando 1200 ChicagoOrlando 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 expertise5 results for mongodb

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

Location

AllDENL

SalaryAll100 - 200200 - 400400 - 600

ExpertiseAllMongoDBJava

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

Fredlocation: US salary: 300 expertise: Oracle, Cobol

Ginalocation: US salary: 200 expertise: Oracle, Pascal

Ivanlocation: NL salary: 400 expertise: Oracle, Fortran

Search | EmpView

Location

AllUSNL

ExpertiseAllOracleCobolPascalFortran

SalaryAll100 - 200200 - 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

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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"}])

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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"}])

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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"}])

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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}

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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"

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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"

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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"

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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\""

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Bertlocation: DE salary: 100 expertise: MongoDB, Java

Coralocation: DE salary: 200 expertise: MongoDB, Java

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

Herblocation: NL salary: 600 expertise: MongoDB, Scala

LocationAllDENL

Salary

All100 - 200200 - 400400 - 600

Expertise

AllMongoDBJava

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

Alexlocation: DE salary: 300 expertise: MongoDB, Ruby

Eriklocation: US salary: 400 expertise: MongoDB, Ruby

LocationAllDE

Salary

All200 - 400

Expertise

AllMongoDB

(2)

1(

( )2Ruby (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} . })

droptake

mapall?

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} . })

droptake

mapall?

mapzip[1,2,3,4,5,6,7,8,9,10]

Ruby

PL Land

droptake

mapall?

mapzip[1,2,3,4,5,6,7,8,9,10]

Ruby

PL Land

droptake

mapall?

mapzip$range: [1, 11, 1]

Ruby

PL Land

droptake

mapall?

map$zip$range: [1, 11, 1]

Ruby

PL Land

droptake

mapall?

map$zip$range: [1, 11, 1]

["A", "B", "C"][10, 20, 30]

Ruby

PL Land

droptake

mapall?

map$zip$range: [1, 11, 1]

["A", "B", "C"][10, 20, 30]

[["A",10], ["B",20], ["C",30]]

Ruby

PL Land

droptake

mapall?

$map$zip$range: [1, 11, 1]

Ruby

PL Land

dropmapall?

$slice$map$zip$range: [1, 11, 1]

Ruby

PL Land

mapall?

$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]$rangeAggregation 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]$rangeAggregation 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]$rangeAggregation 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]$rangeAggregation 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

PipelineOptimisations

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!

Use the Force Aggregation Pipelines! And take control over your Data.

ASK THE EXPERTSGet 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

Recommended