231
Advanced MongoDB Aggregation Pipelines Tom Schreiber

MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

  • Upload
    mongodb

  • View
    598

  • Download
    4

Embed Size (px)

Citation preview

Page 1: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

Advanced MongoDB Aggregation Pipelines

Tom Schreiber

Page 2: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{ "About me" : {

"Name" : "Tom Schreiber",

"Title" : "Senior Consulting Engineer",

"Email" : "[email protected]",

"Twitter" : "@SchreiberTom1",

"Location" : "London, UK"

}

}

Page 3: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
Page 4: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
Page 5: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

"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

Page 6: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 7: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

A Highly Composable Compute Pipeline

MongoDB Aggregation Framework

$sum$match

Page 8: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

A Highly Composable Compute Pipeline

34

3 13

646

36

4

MongoDB Aggregation Framework

$sum$match

Page 9: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

A Highly Composable Compute Pipeline

34

3 13

646

36

4

MongoDB Aggregation Framework

$sum$match

Page 10: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 11: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 12: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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:

Page 13: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

A Highly Composable Compute Pipeline

34

3 13

646

36

4

MongoDB Aggregation Framework

$sum$match

Page 14: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 15: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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!

Page 16: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 17: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 18: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 19: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 20: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 21: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 22: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 23: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 24: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 25: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 26: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 27: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 28: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 29: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 30: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 31: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

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

group_by$sort

Ruby

DB Land

Page 32: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

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

$sort$group

Ruby

DB Land

Page 33: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

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

$sort$group$project

Ruby

DB Land

Page 34: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

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

$sort$group$project $slice

Ruby

DB Land

Page 35: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 36: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 37: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 38: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 39: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 40: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 41: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 42: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 43: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 44: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 45: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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!

Page 46: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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)

!

Page 47: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

λ

PL Land DB Land

Page 48: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

λ

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

Page 49: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land DB Land

Q

Page 50: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 51: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land DB Land

Q

100M 5 GB 2 GB 2 h - OOM 5 m

Page 52: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 53: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 54: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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}

Page 55: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 56: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

!

Page 57: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

!

Page 58: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 59: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 60: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

!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

Page 61: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

DB Land

100M 5 GB 2 GB 2 h - OOM 5 m

$project$group$sort

5 GB

!

Page 62: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

!

Page 63: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

!

Page 64: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 65: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 66: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"}},

])

Page 67: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"}},

])

Page 68: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 69: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 70: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 71: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 72: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 73: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 74: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

], "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

Page 75: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

], "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

Page 76: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 77: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 78: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

"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

Page 79: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

"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

Page 80: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

"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

Page 81: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

"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

Page 82: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

"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

Page 83: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

"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

Page 84: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

"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

Page 85: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

"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

Page 86: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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!

Page 87: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 88: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 89: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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([

Page 90: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 91: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 92: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 93: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 94: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 95: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 96: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 97: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 98: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 99: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 100: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 101: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 102: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 103: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 104: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 105: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 106: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 107: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 108: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 109: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 110: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 111: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 112: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 113: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 114: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 115: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 116: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 117: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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"

Page 118: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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"

Page 119: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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"

Page 120: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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"

Page 121: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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"

Page 122: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 123: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 124: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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"

Page 125: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 126: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 127: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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

Page 128: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 129: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 130: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 131: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 132: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 133: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 134: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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}

},

]}

Page 135: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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}

},

]}

Page 136: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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

Page 137: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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

Page 138: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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}

},

]}

Page 139: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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}

},

]}

Page 140: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

{$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

Page 141: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 142: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 143: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 144: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 145: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 146: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 147: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 148: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 149: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 150: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 151: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 152: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

$

Page 153: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 154: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 155: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

Chicago Boston

Austin

Orlando

Page 156: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 157: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 158: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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

Page 159: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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

Page 160: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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

Page 161: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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✈

Page 162: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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

Page 163: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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

$

Page 164: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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

$

Page 165: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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

$

Page 166: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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

$

Page 167: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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

$

Page 168: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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

Page 169: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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 ✈

Page 170: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

…,{$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 ✈

Page 171: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
Page 172: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
Page 173: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
Page 174: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
Page 175: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
Page 176: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
Page 177: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

Facets{

Page 178: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
Page 179: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
Page 180: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

MongoDB

Page 181: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

MongoDB

_id name dpt sal

Page 182: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

MongoDB

_id name dpt sal

Page 183: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

MongoDB

_id name dpt sal expertise

Page 184: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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)

Page 185: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 186: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 187: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 188: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 189: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 190: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 191: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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}

Page 192: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 193: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 194: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 195: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 196: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 197: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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"

Page 198: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 199: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 200: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 201: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

MongoDB

Page 202: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

MongoDB

One more thing…

Page 203: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

Page 204: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 205: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 206: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

droptake

mapall?

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

Ruby

Page 207: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

droptake

mapall?

mapzip$range: [1, 11, 1]

Ruby

Page 208: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

droptake

mapall?

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

Ruby

Page 209: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

droptake

mapall?

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

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

Ruby

Page 210: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

droptake

mapall?

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

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

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

Ruby

Page 211: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

droptake

mapall?

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

Ruby

Page 212: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

dropmapall?

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

Ruby

Page 213: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

mapall?

$slice$slice

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

Ruby

Page 214: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

all?

$slice$slice$map

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

Ruby

Page 215: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

$slice$slice$map

$allElementsTrue

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

Ruby

Page 216: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

PL Land

$slice$slice

$map$allElementsTrue

$map$zip

$range: [1, 11, 1]Ruby

Page 217: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

$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

Page 218: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

$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

Page 219: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 220: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 221: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

$slice$slice

$map$allElementsTrue

$map$zip

$range

Page 222: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

$slice

$map

$allElementsTrue

$zip

$range

Page 223: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

$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

Page 224: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 225: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 226: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 227: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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!

Page 228: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

Use the Force Aggregation Pipelines!

Page 229: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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

Page 230: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
Page 231: MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

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