SlideShare a Scribd company logo
1 of 231
Download to read offline
Advanced MongoDB
Aggregation Pipelines
Tom Schreiber
{ "About me" : {
"Name" : "Tom Schreiber",
"Title" : "Senior Consulting Engineer",
"Email" : "tom.schreiber@mongodb.com",
"Twitter" : "@SchreiberTom1",
"Location" : "London, UK"
}
}
"Data should be easy to work with."
"The data should serve you.
You should not serve the data."
"The same (data-) model in your head, in your code, and in your data
- NO impedance mismatch."
Eliot Horowitz
CTO & Co-Founder of MongoDB
MongoDB World’16
MongoDB Aggregation Framework
"Data should be easy to work with."
"The data should serve you.
You should not serve the data."
"The same (data-) model in your head, in your code, and in your data
- NO impedance mismatch."
A Highly Composable Compute Pipeline
MongoDB Aggregation Framework
$sum$match
A Highly Composable Compute Pipeline
3
4
3
13
6
4
6
3
6
4
MongoDB Aggregation Framework
$sum$match
A Highly Composable Compute Pipeline
3
4
3
13
6
4
6
3
6
4
MongoDB Aggregation Framework
$sum$match
A Highly Composable Compute Pipeline
3
4
3
13
6
4
6
3
6
4
MongoDB Aggregation Framework
$sum$match
Notions of computation and monads
Eugenio Moggi∗
Abstract
The λ-calculus is considered an useful mathematical tool in the study of programming
languages, since programs can be identified with λ-terms. However, if one goes further and
uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced
(programs are identified with total functions from values to values), that may jeopardise the
applicability of theoretical results. In this paper we introduce calculi based on a categorical
semantics for computations, that provide a correct basis for proving equivalence of programs,
for a wide range of notions of computation.
A Highly Composable Compute Pipeline
3
4
3
13
6
4
6
3
6
4
MongoDB Aggregation Framework
$sum$match
Notions of computation and monads
Eugenio Moggi∗
Abstract
The λ-calculus is considered an useful mathematical tool in the study of programming
languages, since programs can be identified with λ-terms. However, if one goes further and
uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced
(programs are identified with total functions from values to values), that may jeopardise the
applicability of theoretical results. In this paper we introduce calculi based on a categorical
semantics for computations, that provide a correct basis for proving equivalence of programs,
for a wide range of notions of computation.
A monad defines what it means to chain operations together. 

This allows the programmer to build pipelines that process data in a
series of steps […]

Monads allow a programming style where programs are written by
putting together highly composable parts […]
A Highly Composable Compute Pipeline
3
4
3
13
6
4
6
3
6
4
MongoDB Aggregation Framework
$sum$match
Notions of computation and monads
Eugenio Moggi∗
Abstract
The λ-calculus is considered an useful mathematical tool in the study of programming
languages, since programs can be identified with λ-terms. However, if one goes further and
uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced
(programs are identified with total functions from values to values), that may jeopardise the
applicability of theoretical results. In this paper we introduce calculi based on a categorical
semantics for computations, that provide a correct basis for proving equivalence of programs,
for a wide range of notions of computation.
A monad defines what it means to chain operations together. 

This allows the programmer to build pipelines that process data in a
series of steps […]

Monads allow a programming style where programs are written by
putting together highly composable parts […]
Ruby
Module Enumerable:
collect, select, group_by, …
C# / LINQ
IEnumerable<T>:
Select, Where, GroupBy, …
Java
Stream<T>:
collect,filter,groupingBy,…
MongoDB
Aggregation Framework:
$project, $match, $group, …
map, filter, group, …
Haskell
Module Data.List:
A Highly Composable Compute Pipeline
3
4
3
13
6
4
6
3
6
4
MongoDB Aggregation Framework
$sum$match
Aggregation Pipelines
(1) are one of the easiest ways to work with your data.
(2) are highly scalable and optimised for performance.
(3) are (much) more capable and powerful than you think!
3
4
3
13
6
4
6
3
6
4
$sum$match
Aggregation Pipelines
(1) are one of the easiest ways to work with your data.
(2) are highly scalable and optimised for performance.
(3) are (much) more capable and powerful than you think!
1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
The two top paid employees
per departement
1 Alex DE 300
3 Cora DE 200
DE
US
5 Erik US 400
6 Fred US 300
NL
8 Herb NL 600
9 Ivan NL 400
UK
10 Jill UK 500
DB Land
1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
The two top paid employees
per departement
1 Alex DE 300
3 Cora DE 200
DE
US
5 Erik US 400
6 Fred US 300
NL
8 Herb NL 600
9 Ivan NL 400
UK
10 Jill UK 500
DB Land
1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
The two top paid employees
per departement
select id, name, dpt, sal
from emps
where sal =
(select max(sal)
from emps as e
where e.dpt = emps.dpt)
or sal =
(select max(sal)
from emps as e
where e.dpt = emps.dpt
and sal <
(select max(sal)
from emps as e2
where e2.dpt = emps.dpt));
DB Land
1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
The two top paid employees
per departement
select r.id, r.name, r.dpt, r.sal

from (select id, name, dept, sal,

rank()

OVER (PARTITION BY dpt

ORDER BY sal DESC)
as rank

from emps) AS r

where r.rank <= 2

order by r.dpt, r.rank
1 Alex DE 300
3 Cora DE 200
5 Erik US 400
6 Fred US 300
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
DB Land
1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
The two top paid employees
per departement
1 Alex DE 300
3 Cora DE 200
5 Erik US 400
6 Fred US 300
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
1 Alex DE 300
3 Cora DE 200
DE
US
5 Erik US 400
6 Fred US 300
NL
8 Herb NL 600
9 Ivan NL 400
UK
10 Jill UK 500
?
DB Land
1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
The two top paid employees
per departement
1 Alex DE 300
3 Cora DE 200
5 Erik US 400
6 Fred US 300
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
1 Alex DE 300
3 Cora DE 200
DE
US
5 Erik US 400
6 Fred US 300
NL
8 Herb NL 600
9 Ivan NL 400
UK
10 Jill UK 500
?
"Data should be easy to work with."
"The data should serve you.
You should not serve the data."
"The same (data-) model in your head, in your code, and in your data
- NO impedance mismatch."
DB Land
1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
DB LandPL Land
PL Land
1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
DB Land
PL Land
{"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]]
{"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},,
{"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},,
{"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},,
{"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},,
{"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},,
{"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},,
{"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},,
{"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},,
[{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[
DB Land
PL Land
{"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]]
{"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},,
{"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},,
{"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},,
{"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},,
{"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},,
{"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},,
{"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},,
{"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},,
[{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[
emps. {|e| [e["dpt"], -e["sal"]]}
. {|e| e["dpt"]}
. {|k,v| [k => v. (2)]}collect
group_by
sort_by
take
Ruby
DB Land
PL Land
emps. {|e| [e["dpt"], -e["sal"]]}
. {|e| e["dpt"]}
. {|k,v| [k => v. (2)]}collect
group_by
sort_by
take
{"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]]
{"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},,
{"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},,
{"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},,
{"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},,
{"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},,
{"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},,
{"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},,
{"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},,
[{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[
Ruby
DB Land
PL Land
},
[{"DE"=>
]
]
]
[
[
[
[{"US"=>
[{"NL"=>
[{"UK"=>
},
},
]
emps. {|e| [e["dpt"], -e["sal"]]}
. {|e| e["dpt"]}
. {|k,v| [k => v. (2)]}collect
group_by
sort_by
take
{"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]]
{"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},,
{"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},,
{"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},,
{"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},,
{"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},,
{"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},,
{"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},,
{"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},,
[{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[
Ruby
DB Land
PL Land
},{"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},,
{"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},,[[{"NL"=>
{"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},,
{"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},,[[{"US"=>
},
[{"DE"=>
{"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},,
[{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[
},
{"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]][[{"UK"=> ]
emps. {|e| [e["dpt"], -e["sal"]]}
. {|e| e["dpt"]}
. {|k,v| [k => v. (2)]}collect
group_by
sort_by
take
]
]]
]]
Ruby
DB Land
PL Land
emps. {|e| [e["dpt"], -e["sal"]]}
. {|e| e["dpt"]}
. {|k,v| [k => v. (2)]}takecollect
group_by
sort_by
},{"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},,
{"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},,
]
[[{"NL"=>
{"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},,
{"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},,
]
[[{"US"=>
},
[{"DE"=>
{"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},,
[{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[
] },
{"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]][[{"UK"=> ]
1 Alex DE 300
3 Cora DE 200
DE
US
5 Erik US 400
6 Fred US 300
NL
8 Herb NL 600
9 Ivan NL 400
UK
10 Jill UK 500
Ruby
DB Land
emps. {|e| [e["dpt"], -e["sal"]]}
. {|e| e["dpt"]}
. {|k,v| [k => v. (2)]}collect
group_by
sort_by
Ruby
PL Land
emps.sorted(Comparator.comparing(Employee::getDpt)
.thenComparing(Employee::getSal)
.reversed()).collect(Collectors

.groupingBy(Employee::getDpt, Collectors

.collectingAndThen(Collectors.toList(),l->l.stream()
.limit(2).collect(
Collectors.toList()))));
emps.OrderBy(e => e.Dpt).ThenByDescending(e => e.Sal)
.GroupBy(e => e.Dpt)
.Select(g => new {Key = g.Key, Emps = g.Take(2)})
C# / LINQ
Java Streams
take
DB Land
PL Land
emps. {|e| [e["dpt"], -e["sal"]]}
. {|e| e["dpt"]}
. {|k,v| [k => v. (2)]}takecollect
group_by
$sort
Ruby
DB Land
PL Land
emps. {|e| [e["dpt"], -e["sal"]]}
. {|e| e["dpt"]}
. {|k,v| [k => v. (2)]}takecollect
$sort
$group
Ruby
DB Land
PL Land
emps. {|e| [e["dpt"], -e["sal"]]}
. {|e| e["dpt"]}
. {|k,v| [k => v. (2)]}take
$sort
$group
$project
Ruby
DB Land
PL Land
emps. {|e| [e["dpt"], -e["sal"]]}
. {|e| e["dpt"]}
. {|k,v| [k => v. (2)]}
$sort
$group
$project $slice
Ruby
DB Land
PL Land
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
])
$sort
$group
$project $slice
Aggregation Pipeline
DB Land
PL Land
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
])
$sort
$group
$project $slice
Aggregation Pipeline
DB Land
$project
$slice
$group$sort
MongoDB
PL Land
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
])
$sort
$group
$project $slice
Aggregation Pipeline
PL Land DB Land
$project
$slice
$group$sort
MongoDB
PL Land
{"_id":10, "name":"Jill", "dpt":"UK", "sal":500}]
{"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400},
{"_id": 8, "name":"Herb", "dpt":"NL", "sal":600},
{"_id": 7, "name":"Gina", "dpt":"US", "sal":200},
{"_id": 6, "name":"Fred", "dpt":"US", "sal":300},
{"_id": 5, "name":"Erik", "dpt":"US", "sal":400},
{"_id": 4, "name":"Drew", "dpt":"US", "sal":200},
{"_id": 3, "name":"Cora", "dpt":"DE", "sal":200},
{"_id": 2, "name":"Bert", "dpt":"DE", "sal":100},
[{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300},
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
])
$sort
$group
$project $slice
Aggregation Pipeline
DB Land
MongoDB
PL Land
{"_id":10, "name":"Jill", "dpt":"UK", "sal":500}]
{"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400},
{"_id": 8, "name":"Herb", "dpt":"NL", "sal":600},
{"_id": 7, "name":"Gina", "dpt":"US", "sal":200},
{"_id": 6, "name":"Fred", "dpt":"US", "sal":300},
{"_id": 5, "name":"Erik", "dpt":"US", "sal":400},
{"_id": 4, "name":"Drew", "dpt":"US", "sal":200},
{"_id": 3, "name":"Cora", "dpt":"DE", "sal":200},
{"_id": 2, "name":"Bert", "dpt":"DE", "sal":100},
[{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300},
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
])
$sort
$group
$project $slice
Aggregation Pipeline
DB Land
MongoDB
PL Land
{"_id":10, "name":"Jill", "dpt":"UK", "sal":500}]
{"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400},
{"_id": 8, "name":"Herb", "dpt":"NL", "sal":600},
{"_id": 7, "name":"Gina", "dpt":"US", "sal":200},
{"_id": 6, "name":"Fred", "dpt":"US", "sal":300},
{"_id": 5, "name":"Erik", "dpt":"US", "sal":400},
{"_id": 4, "name":"Drew", "dpt":"US", "sal":200},
{"_id": 3, "name":"Cora", "dpt":"DE", "sal":200},
{"_id": 2, "name":"Bert", "dpt":"DE", "sal":100},
[{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300},
[{"_id" :"DE",
"emps":
},
{"_id" :"US",
"emps":
},
{"_id" :"NL",
"emps":
},
{"_id" :"UK",
"emps":
]
]
]
}]
[
[
[
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
])
$sort
$group
$project $slice
Aggregation Pipeline
DB Land
MongoDB
PL Land
{"_id": 3, "name":"Cora", "dpt":"DE", "sal":200},
[{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300},
[{"dpt" :"DE",
"emps":
},]
{"_id": 6, "name":"Fred", "dpt":"US", "sal":300},
{"_id": 5, "name":"Erik", "dpt":"US", "sal":400},
{"dpt" :"US",
"emps":
},]
{"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400},
{"_id": 8, "name":"Herb", "dpt":"NL", "sal":600},
{"dpt" :"NL",
"emps":
},]
{"_id":10, "name":"Jill", "dpt":"UK", "sal":500}]
{"dpt" :"UK",
"emps": }]
[
[
[
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
])
$sort
$group
$project $slice
Aggregation Pipeline
DB Land
MongoDB
PL Land
{"_id": 3, "name":"Cora", "dpt":"DE", "sal":200},
[{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300},
[{"dpt" :"DE",
"emps":
},]
{"_id": 6, "name":"Fred", "dpt":"US", "sal":300},
{"_id": 5, "name":"Erik", "dpt":"US", "sal":400},
{"dpt" :"US",
"emps":
},]
{"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400},
{"_id": 8, "name":"Herb", "dpt":"NL", "sal":600},
{"dpt" :"NL",
"emps":
},]
{"_id":10, "name":"Jill", "dpt":"UK", "sal":500}]
{"dpt" :"UK",
"emps": }]
[
[
[
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
])
$sort
$group
$project $slice
1 Alex DE 300
3 Cora DE 200
DE
US
5 Erik US 400
6 Fred US 300
NL
8 Herb NL 600
9 Ivan NL 400
UK
10 Jill UK 500
Aggregation Pipeline
DB Land
MongoDB
PL Land
{"_id": 3, "name":"Cora", "dpt":"DE", "sal":200},
[{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300},
[{"dpt" :"DE",
"emps":
},]
{"_id": 6, "name":"Fred", "dpt":"US", "sal":300},
{"_id": 5, "name":"Erik", "dpt":"US", "sal":400},
{"dpt" :"US",
"emps":
},]
{"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400},
{"_id": 8, "name":"Herb", "dpt":"NL", "sal":600},
{"dpt" :"NL",
"emps":
},]
{"_id":10, "name":"Jill", "dpt":"UK", "sal":500}]
{"dpt" :"UK",
"emps": }]
[
[
[
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
])
$sort
$group
$project $slice
1 Alex DE 300
3 Cora DE 200
DE
US
5 Erik US 400
6 Fred US 300
NL
8 Herb NL 600
9 Ivan NL 400
UK
10 Jill UK 500
"Data should be easy to work with."
"The data should serve you.
You should not serve the data."
"The same (data-) model in your head, in your code, and in your data
- NO impedance mismatch."
Aggregation Pipeline
DB Land
MongoDB
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
])
$sort
$group
$project $slice
Aggregation Pipeline
emps.OrderBy(e => e.Dpt).ThenByDescending(e => e.Sal)
.GroupBy(e => e.Dpt)
.Select(g => new {Key = g.Key, Emps = g.Take(2)})
C#
emps.sorted(Comparator.comparing(Employee::getDpt)
.thenComparing(Employee::getSal)
.reversed()).collect(Collectors

.groupingBy(Employee::getDpt, Collectors

.collectingAndThen(Collectors.toList(),l->l.stream()
.limit(2).collect(
Collectors.toList()))));
Java
emps. {|e| [e["dpt"], -e["sal"]]}
. {|e| e["dpt"]}
. {|k,v| [k => v. (2)]}collect
group_by
sort_by Ruby
take
DB LandPL Land
Aggregation Pipelines
(1) are one of the easiest ways to work with your data.
(2) are highly scalable and optimised for performance.
(3) are (much) more capable and powerful than you think!
Benchmarking
PL Land vs DB Land
2,2 GHz Intel Core i7 CPU
16 GB 1600 MHz DDR3 RAM
SSD-Storage
MongoDB Enterprise 3.4.0-rc0
WiredTiger (12 GB Cache Size,
snappy compressor)
!
λ
PL Land DB Land
λ
PL Land DB Land
# Employees Data Size Index Size Runtime
1M 50 MB 20 MB 6 s + 7 s
10M 500 MB 200 MB 133 s + 99 s
100M 5 GB 2 GB 2 h - OOM
PL Land DB Land
Q
PL Land DB Land
Q
# Employees Data Size Index Size Runtime Runtime
1M 50 MB 20 MB 6 s + 7 s 100 ms
10M 500 MB 200 MB 133 s + 99 s 1 s
100M 5 GB 2 GB 2 h - OOM 5 m
PL Land DB Land
Q
100M 5 GB 2 GB 2 h - OOM 5 m
DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
]
$slice
)
$project
$group
$sort
$project
$group
$sort
5 GB
DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
]
$slice
)
$project
$group
$sort
$project
$group
$sort
5 GB"errmsg":"Exceeded	memory	limit	for	$group,		
										but	didn't	allow	external	sort.

										Pass	allowDiskUse:true	to	opt	in."
DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
]
$slice
)
$project
$group
$sort
$project
$group
$sort
5 GB
,{allowDiskUse:true}
DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
]
$slice
)
$project
$group
$sort
$project
$group
$sort
5 GB
,{allowDiskUse:true}
!
CPU Load
DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
$project
$group
$sort
5 GB
mongod --dbpath ~/data/shard1 --port 40001
mongod --dbpath ~/data/shard2 --port 40002
…
mongod --dbpath ~/data/shard10 --port 40010
!
DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
$project
$group
$sort
5 GB
mongod --dbpath ~/data/shard1 --port 40001
mongod --dbpath ~/data/shard2 --port 40002
…
mongod --dbpath ~/data/shard10 --port 40010
!
DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
$project
$group
$sort
5 GB
mongod --dbpath ~/data/shard1 --port 40001
mongod --dbpath ~/data/shard2 --port 40002
…
mongod --dbpath ~/data/shard10 --port 40010
!
sh.addShard("Toms-MacBook-Pro.local:40001")
sh.addShard("Toms-MacBook-Pro.local:40002")
…
sh.addShard("Toms-MacBook-Pro.local:40010")
DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
$project
$group
$sort
5 GB
mongod --dbpath ~/data/shard1 --port 40001
mongod --dbpath ~/data/shard2 --port 40002
…
mongod --dbpath ~/data/shard10 --port 40010
!
sh.addShard("Toms-MacBook-Pro.local:40001")
sh.addShard("Toms-MacBook-Pro.local:40002")
…
sh.addShard("Toms-MacBook-Pro.local:40010")
sh.shardCollection("DB.emps", {dpt:1})
!DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
$project
$group
$sort
5 GB
mongod --dbpath ~/data/shard1 --port 40001
mongod --dbpath ~/data/shard2 --port 40002
…
mongod --dbpath ~/data/shard10 --port 40010
!
sh.addShard("Toms-MacBook-Pro.local:40001")
sh.addShard("Toms-MacBook-Pro.local:40002")
…
sh.addShard("Toms-MacBook-Pro.local:40010")
sh.shardCollection("DB.emps", {dpt:1})
"Micro-Sharding"
0.5 GB0.5 GB0.5 GB0.5 GB0.5 GB
0.5 GB 0.5 GB 0.5 GB 0.5 GB 0.5 GB
DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
$project
$group
$sort
5 GB
DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
$project
$group
$sort
0.5 GB0.5 GB 0.5 GB0.5 GB
0.5 GB0.5 GB0.5 GB0.5 GB0.5 GB
0.5 GB
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
$project
$group
$sort
0.5 GB0.5 GB 0.5 GB0.5 GB
0.5 GB0.5 GB0.5 GB0.5 GB0.5 GB
0.5 GB
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
$project
$group
$sort
6 s
!
CPU Load
DB Land
{"name":"Cora", "dpt":"DE", "sal":200},
{"name":"Alex", "dpt":"DE", "sal":300},
[{"dpt" :"DE",
"emps":
},]
{"name":"Fred", "dpt":"US", "sal":300},
{"name":"Erik", "dpt":"US", "sal":400},
{"dpt" :"US",
"emps":
},]
{"name":"Ivan", "dpt":"NL", "sal":400},
{"name":"Herb", "dpt":"NL", "sal":600},
{"dpt" :"NL",
"emps":
},]
{"name":"Jill", "dpt":"UK", "sal":500}]
{"dpt" :"UK",
"emps" }]
[
[
[
db.emps.aggregate([
[
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
])
DB Land
{"name":"Cora", "dpt":"DE", "sal":200},
{"name":"Alex", "dpt":"DE", "sal":300},
[{"dpt" :"DE",
"emps":
},]
{"name":"Fred", "dpt":"US", "sal":300},
{"name":"Erik", "dpt":"US", "sal":400},
{"dpt" :"US",
"emps":
},]
{"name":"Ivan", "dpt":"NL", "sal":400},
{"name":"Herb", "dpt":"NL", "sal":600},
{"dpt" :"NL",
"emps":
},]
{"name":"Jill", "dpt":"UK", "sal":500}]
{"dpt" :"UK",
"emps" }]
[
[
[
db.emps.aggregate([
[
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
])
DB Land
{"name":"Cora", "dpt":"DE", "sal":200},
{"name":"Alex", "dpt":"DE", "sal":300},
[{"dpt" :"DE",
"emps":
},]
{"name":"Fred", "dpt":"US", "sal":300},
{"name":"Erik", "dpt":"US", "sal":400},
{"dpt" :"US",
"emps":
},]
{"name":"Ivan", "dpt":"NL", "sal":400},
{"name":"Herb", "dpt":"NL", "sal":600},
{"dpt" :"NL",
"emps":
},]
{"name":"Jill", "dpt":"UK", "sal":500}]
{"dpt" :"UK",
"emps" }]
[
[
[
db.emps.aggregate([
[
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
])
DB Land
{"name":"Cora", "dpt":"DE", "sal":200},
{"name":"Alex", "dpt":"DE", "sal":300},
[{"dpt" :"DE",
"emps":
},]
{"name":"Fred", "dpt":"US", "sal":300},
{"name":"Erik", "dpt":"US", "sal":400},
{"dpt" :"US",
"emps":
},]
{"name":"Ivan", "dpt":"NL", "sal":400},
{"name":"Herb", "dpt":"NL", "sal":600},
{"dpt" :"NL",
"emps":
},]
{"name":"Jill", "dpt":"UK", "sal":500}]
{"dpt" :"UK",
"emps" }]
[
[
[
db.emps.aggregate([
[
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
])
DB Land
{"name":"Cora", "dpt":"DE", "sal":200},
{"name":"Alex", "dpt":"DE", "sal":300},
[{"dpt" :"DE",
"emps":
},]
{"name":"Fred", "dpt":"US", "sal":300},
{"name":"Erik", "dpt":"US", "sal":400},
{"dpt" :"US",
"emps":
},]
{"name":"Ivan", "dpt":"NL", "sal":400},
{"name":"Herb", "dpt":"NL", "sal":600},
{"dpt" :"NL",
"emps":
},]
{"name":"Jill", "dpt":"UK", "sal":500}]
{"dpt" :"UK",
"emps" }]
[
[
[
db.emps.aggregate([
]
[
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
{

"stages": [

{

"$cursor": {

"query": {

"dpt": "DE"

},

"sort": {

"dpt": 1,

"sal": -1

},

"fields": {

"dpt": 1,

"name": 1,

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
{

"stages": [

{

"$cursor": {

"query": {

"dpt": "DE"

},

"sort": {

"dpt": 1,

"sal": -1

},

"fields": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
{

"stages": [

{

"$cursor": {

"query": {

"dpt": "DE"

},

"sort": {

"dpt": 1,

"sal": -1

},

"fields": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$cursor
],

"name": [

"[MinKey, MaxKey]"

]

}

}

},

"rejectedPlans": []

}

}

},

{

"$group": {

"_id": "$dpt",

"emps": {

"$push": {

"name": "$name",

"sal": "$sal"

}

}

}

},

{

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$cursor
],

"name": [

"[MinKey, MaxKey]"

]

}

}

},

"rejectedPlans": []

}

}

},

{

"$group": {

"_id": "$dpt",

"emps": {

"$push": {

"name": "$name",

"sal": "$sal"

}

}

}

},

{

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$cursor
"_id": "$dpt",

"emps": {

"$push": {

"name": "$name",

"sal": "$sal"

}

}

}

},

{

"$project": {

"_id": false,

"dpt": "$_id",

"emps": {

"$slice": [

"$emps",

{

"$const": 2

}

]

}

}

}

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$cursor
"_id": "$dpt",

"emps": {

"$push": {

"name": "$name",

"sal": "$sal"

}

}

}

},

{

"$project": {

"_id": false,

"dpt": "$_id",

"emps": {

"$slice": [

"$emps",

{

"$const": 2

}

]

}

}

}

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
"queryPlanner": {

"plannerVersion": 1,

"namespace": "DB.emps",

"indexFilterSet": false,

"parsedQuery": {

"dpt": {

"$eq": "DE"

}

},

"winningPlan": {

"stage": "PROJECTION",

"transformBy": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

"inputStage": {

"stage": "IXSCAN",

"keyPattern": {

"dpt": 1,

"sal": -1,

"name": 1

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
"queryPlanner": {

"plannerVersion": 1,

"namespace": "DB.emps",

"indexFilterSet": false,

"parsedQuery": {

"dpt": {

"$eq": "DE"

}

},

"winningPlan": {

"stage": "PROJECTION",

"transformBy": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

"inputStage": {

"stage": "IXSCAN",

"keyPattern": {

"dpt": 1,

"sal": -1,

"name": 1

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
IXSCAN
Index on

"dpt":1,
"sal":-1,
"name":1
PROJECTION
"multiKeyPaths": {

"dpt": [],

"sal": [],

"name": []

},

"isUnique": false,

"isSparse": false,

"isPartial": false,

"indexVersion": 2,

"direction": "forward",

"indexBounds": {

"dpt": [

"["DE", "DE"]"

],

"sal": [

"[MaxKey, MinKey]"

],

"name": [

"[MinKey, MaxKey]"

]

}

}

},

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
IXSCAN
Index on

"dpt":1,
"sal":-1,
"name":1
PROJECTION
"multiKeyPaths": {

"dpt": [],

"sal": [],

"name": []

},

"isUnique": false,

"isSparse": false,

"isPartial": false,

"indexVersion": 2,

"direction": "forward",

"indexBounds": {

"dpt": [

"["DE", "DE"]"

],

"sal": [

"[MaxKey, MinKey]"

],

"name": [

"[MinKey, MaxKey]"

]

}

}

},

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
IXSCAN
Index on

"dpt":1,
"sal":-1,
"name":1
PROJECTION
Index used
for sorting
"multiKeyPaths": {

"dpt": [],

"sal": [],

"name": []

},

"isUnique": false,

"isSparse": false,

"isPartial": false,

"indexVersion": 2,

"direction": "forward",

"indexBounds": {

"dpt": [

"["DE", "DE"]"

],

"sal": [

"[MaxKey, MinKey]"

],

"name": [

"[MinKey, MaxKey]"

]

}

}

},

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
IXSCAN
Index on

"dpt":1,
"sal":-1,
"name":1
PROJECTION
Index used
for sorting
Pipeline
Reordering:
Index used
for matching
"queryPlanner": {

"plannerVersion": 1,

"namespace": "DB.emps",

"indexFilterSet": false,

"parsedQuery": {

"dpt": {

"$eq": "DE"

}

},

"winningPlan": {

"stage": "PROJECTION",

"transformBy": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

"inputStage": {

"stage": "IXSCAN",

"keyPattern": {

"dpt": 1,

"sal": -1,

"name": 1

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
IXSCAN
Index on

"dpt":1,
"sal":-1,
"name":1
PROJECTION
Index used
for sorting
Pipeline
Reordering:
Index used
for matching
"queryPlanner": {

"plannerVersion": 1,

"namespace": "DB.emps",

"indexFilterSet": false,

"parsedQuery": {

"dpt": {

"$eq": "DE"

}

},

"winningPlan": {

"stage": "PROJECTION",

"transformBy": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

"inputStage": {

"stage": "IXSCAN",

"keyPattern": {

"dpt": 1,

"sal": -1,

"name": 1

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
IXSCAN
Index on

"dpt":1,
"sal":-1,
"name":1
PROJECTION
Index used
for sorting
Pipeline
Reordering:
Index used
for matching
Projection
Optimization:
Query turned to
Covered Query
"queryPlanner": {

"plannerVersion": 1,

"namespace": "DB.emps",

"indexFilterSet": false,

"parsedQuery": {

"dpt": {

"$eq": "DE"

}

},

"winningPlan": {

"stage": "PROJECTION",

"transformBy": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

"inputStage": {

"stage": "IXSCAN",

"keyPattern": {

"dpt": 1,

"sal": -1,

"name": 1

db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
IXSCAN
Index on

"dpt":1,
"sal":-1,
"name":1
PROJECTION
Index used
for sorting
Pipeline
Reordering:
Index used
for matching
Projection
Optimization:
Query turned to
Covered Query
DB Land
Aggregation Pipelines
(1) are one of the easiest ways to work with your data.
(2) are highly scalable and optimised for performance.
(3) are (much) more capable and powerful than you think!
1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
DB Land
_id name dpt sal
1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
DB Land
_id name dpt sal
10
3
1
6
10
5
5
10
8
bid
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
$match $graphLookup
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]
3 Cora DE 200 1
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]
3 Cora DE 200 1
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]
3 Cora DE 200 1
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]
3 Cora DE 200 1
_id name dpt sal bid
"
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{
}
2 Bert DE 100 3
_id name dpt sal bid
"bosses":[,
]
3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"lvl":1,{ }
,
db.emps.aggregate([
])
Bert’s bosses
{$match: {name:"Bert"}},
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{
}
2 Bert DE 100 3
_id name dpt sal bid
"bosses":[,
]
3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"lvl":1,{ }
,
10 Jill UK 500
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{
}
2 Bert DE 100 3
_id name dpt sal bid
"bosses":[,
]
3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"lvl":1,{ }
,
10 Jill UK 500
_id name dpt sal bid
"
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{
}
2 Bert DE 100 3
_id name dpt sal bid
"bosses":[,
]
3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"lvl":1,{ }
,
10 Jill UK 500
_id name dpt sal bid
"lvl":2,{ }
,
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
Bert’s bosses
{
}
2 Bert DE 100 3
_id name dpt sal bid
"bosses":[,
]
3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"lvl":1,{ }
,
10 Jill UK 500
_id name dpt sal bid
"lvl":2,{ }
,
{$match: {name:"Bert"}},
db.emps.aggregate([
])
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
Bert’s bosses
{
}
2 Bert DE 100 3
_id name dpt sal bid
"bosses":[,
]
3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"lvl":1,{ }
,
10 Jill UK 500
_id name dpt sal bid
"lvl":2,{ }
,
{$match: {name:"Bert"}},
db.emps.aggregate([
])
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
Bert’s bosses
{$match: {name:"Bert"}},
db.emps.aggregate([
])
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
The two employees bosseswith most
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
])
db.emps.aggregate([
,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
$limit$graphLookup $sort
8 Herb NL 600 10
10 Jill UK 500
5 Erik US 400 105 Erik US 400 10
10 Jill UK 500
6 Fred US 300 5
1 Alex DE 300 10
3 Cora DE 200 1
10 Jill UK 50010 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[]}]
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
8 Herb NL 600 10
10 Jill UK 500
5 Erik US 400 105 Erik US 400 10
10 Jill UK 500
6 Fred US 300 5
1 Alex DE 300 10
3 Cora DE 200 1
10 Jill UK 50010 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[]}]
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
8 Herb NL 600 10
10 Jill UK 500
5 Erik US 400 105 Erik US 400 10
10 Jill UK 500
6 Fred US 300 5
1 Alex DE 300 10
3 Cora DE 200 1
10 Jill UK 50010 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[]}]
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}[
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[]}]
3 Cora DE 200 1
1 Alex DE 300 10
6 Fred US 300 5
10 Jill UK 500
5 Erik US 400 10
5 Erik US 400 10
10 Jill UK 500
8 Herb NL 600 10
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 50010 Jill UK 50010 Jill UK 500
5 Erik US 400 10
10 Jill UK 500
1 Alex DE 300 10
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}[
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[]}]
3 Cora DE 200 1
1 Alex DE 300 10
6 Fred US 300 5
10 Jill UK 500
5 Erik US 400 10
5 Erik US 400 10
10 Jill UK 500
8 Herb NL 600 10
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}[
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[]}]
3 Cora DE 200 1 1 Alex DE 300 10
1 Alex DE 300 10 10 Jill UK 500
6 Fred US 300 5 5 Erik US 400 10
10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
10 Jill UK 500
8 Herb NL 600 10 10 Jill UK 500
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 50010 Jill UK 50010 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}[
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[]}]
3 Cora DE 200 1 1 Alex DE 300 10
1 Alex DE 300 10 10 Jill UK 500
6 Fred US 300 5 5 Erik US 400 10
10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
10 Jill UK 500
8 Herb NL 600 10 10 Jill UK 500
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0} }] ,[
{ ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[]}]
3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500
1 Alex DE 300 10 10 Jill UK 500
6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500
10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
10 Jill UK 500
8 Herb NL 600 10 10 Jill UK 500
}] ,
}] ,}] ,
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0} }] ,[
{ ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[]}]
3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500
1 Alex DE 300 10 10 Jill UK 500
6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500
10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
10 Jill UK 500
8 Herb NL 600 10 10 Jill UK 500
}] ,
}] ,}] ,
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
[
1 Alex DE 300 10{ ,"bosses":[{ ,"lvl":0} }] ,10 Jill UK 500
10 Jill UK 500{ ,"bosses":[]}]
5 Erik US 400 10{ ,"bosses":[{ ,"lvl":0}10 Jill UK 500 }] ,
8 Herb NL 600 10{ ,"bosses":[{ ,"lvl":0}10 Jill UK 500 }] ,}] ,
2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]},
4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]},
6 Fred US 300 5 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},5 Erik US 400 10 10 Jill UK 500 ]},
7 Gina US 200 5 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},5 Erik US 400 10 10 Jill UK 500 ]},
3 Cora DE 200 1 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},1 Alex DE 300 10 10 Jill UK 500 ]},
9 Ivan NL 400 8 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},8 Herb NL 600 10 10 Jill UK 500 ]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
[ 2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]},
4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]}]
The two employees bosseswith most
])
db.emps.aggregate([
,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}} ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
[ 2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]},
4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]}]
The two employees bosseswith most
"bid" "_id""$bid"
"bosses"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}} ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employees bosseswith most
"bid" "_id""$bid"
"bosses"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}} ,
{$sort:{"bosses.leve:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
"bid" "_id""$bid"
"bosses"
The two employeesbosses with most
"bosses.lvl"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}} ,
{$sort:{"bosses.leve:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
"bid""_id""$bid"
"bosses"
The two employeesbosses with most
"bosses.lvl"
,
{$sort:{"bosses.leve:-1}}, {$limit:2}
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"emps"
"bosses.lvl"
"$_id" "_id" "bid"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses.leve:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"bosses.lvl"
"$_id" "_id" "bid"
"emps" ,
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses.leve:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses.leve:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
$limit$graphLookup $sort$addFields
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
[{ ,"emps":[],
"hdcnt":0}]
9 Ivan NL 400 8
[{ ,"emps":[],
"hdcnt":0}
7 Gina US 200 5
[{ ,"emps":[],
"hdcnt":0}
4 Drew US 200 6
[{ ,"emps":[],
"hdcnt":0}
2 Bert DE 100 3
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
8 Herb NL 600 10 9 Ivan NL 400 8
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
6 Fred US 300 5 4 Drew US 200 6
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
[ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ],
"hdcnt":3}
[{ ,"emps":[],
"hdcnt":0}
7 Gina US 200 5
[{ ,"emps":[],
"hdcnt":0}
4 Drew US 200 6
[{ ,"emps":[],
"hdcnt":0}
2 Bert DE 100 3
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
3 Cora DE 200 1 2 Bert DE 100 3
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
8 Herb NL 600 10 9 Ivan NL 400 8
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
6 Fred US 300 5 4 Drew US 200 6
[ { ,"lvl":1}],{ ,"emps":[{ ,"lvl":0},
"hdcnt":2},
1 Alex DE 300 10 3 Cora DE 200 1 2 Bert DE 100 3
, 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
[ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , ,
{ ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , ,
{ ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3
1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10
3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5
9 Ivan NL 400 8
"hdcnt":9},
[ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ],
"hdcnt":3}
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
3 Cora DE 200 1 2 Bert DE 100 3
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
8 Herb NL 600 10 9 Ivan NL 400 8
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
6 Fred US 300 5 4 Drew US 200 6
[ { ,"lvl":1}],{ ,"emps":[{ ,"lvl":0},
"hdcnt":2},
1 Alex DE 300 10 3 Cora DE 200 1 2 Bert DE 100 3
,
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines
MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

More Related Content

What's hot

Hierarchical data models in Relational Databases
Hierarchical data models in Relational DatabasesHierarchical data models in Relational Databases
Hierarchical data models in Relational Databases
navicorevn
 

What's hot (20)

Advanced MySQL Query Tuning
Advanced MySQL Query TuningAdvanced MySQL Query Tuning
Advanced MySQL Query Tuning
 
Infix prefix postfix
Infix prefix postfixInfix prefix postfix
Infix prefix postfix
 
Sql views
Sql viewsSql views
Sql views
 
Open Source North - MongoDB Advanced Schema Design Patterns
Open Source North - MongoDB Advanced Schema Design PatternsOpen Source North - MongoDB Advanced Schema Design Patterns
Open Source North - MongoDB Advanced Schema Design Patterns
 
Sql queries presentation
Sql queries presentationSql queries presentation
Sql queries presentation
 
Hierarchical data models in Relational Databases
Hierarchical data models in Relational DatabasesHierarchical data models in Relational Databases
Hierarchical data models in Relational Databases
 
MongoDB World 2019: Tips and Tricks++ for Querying and Indexing MongoDB
MongoDB World 2019: Tips and Tricks++ for Querying and Indexing MongoDBMongoDB World 2019: Tips and Tricks++ for Querying and Indexing MongoDB
MongoDB World 2019: Tips and Tricks++ for Querying and Indexing MongoDB
 
Introduction to Python Programming
Introduction to Python ProgrammingIntroduction to Python Programming
Introduction to Python Programming
 
sql function(ppt)
sql function(ppt)sql function(ppt)
sql function(ppt)
 
Materialized Views and Secondary Indexes in Scylla: They Are finally here!
Materialized Views and Secondary Indexes in Scylla: They Are finally here!Materialized Views and Secondary Indexes in Scylla: They Are finally here!
Materialized Views and Secondary Indexes in Scylla: They Are finally here!
 
Mongodb Aggregation Pipeline
Mongodb Aggregation PipelineMongodb Aggregation Pipeline
Mongodb Aggregation Pipeline
 
String Manipulation in Python
String Manipulation in PythonString Manipulation in Python
String Manipulation in Python
 
SQL Programming Assignment Help
SQL Programming Assignment HelpSQL Programming Assignment Help
SQL Programming Assignment Help
 
Stack data structure in Data Structure using C
Stack data structure in Data Structure using C Stack data structure in Data Structure using C
Stack data structure in Data Structure using C
 
How to Use JSON in MySQL Wrong
How to Use JSON in MySQL WrongHow to Use JSON in MySQL Wrong
How to Use JSON in MySQL Wrong
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)
 
Webscale PostgreSQL - JSONB and Horizontal Scaling Strategies
Webscale PostgreSQL - JSONB and Horizontal Scaling StrategiesWebscale PostgreSQL - JSONB and Horizontal Scaling Strategies
Webscale PostgreSQL - JSONB and Horizontal Scaling Strategies
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance Tuning
 
Inside MongoDB: the Internals of an Open-Source Database
Inside MongoDB: the Internals of an Open-Source DatabaseInside MongoDB: the Internals of an Open-Source Database
Inside MongoDB: the Internals of an Open-Source Database
 
Alasql JavaScript SQL Database Library: User Manual
Alasql JavaScript SQL Database Library: User ManualAlasql JavaScript SQL Database Library: User Manual
Alasql JavaScript SQL Database Library: User Manual
 

Viewers also liked

Data Processing and Aggregation with MongoDB
Data Processing and Aggregation with MongoDB Data Processing and Aggregation with MongoDB
Data Processing and Aggregation with MongoDB
MongoDB
 
MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)
MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)
MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)
MongoDB
 
Building Your First Application with MongoDB
Building Your First Application with MongoDBBuilding Your First Application with MongoDB
Building Your First Application with MongoDB
MongoDB
 

Viewers also liked (20)

MongoDB Europe 2016 - MongoDB 3.4 preview and introduction to MongoDB Atlas
MongoDB Europe 2016 - MongoDB 3.4 preview and introduction to MongoDB AtlasMongoDB Europe 2016 - MongoDB 3.4 preview and introduction to MongoDB Atlas
MongoDB Europe 2016 - MongoDB 3.4 preview and introduction to MongoDB Atlas
 
Webinar: Exploring the Aggregation Framework
Webinar: Exploring the Aggregation FrameworkWebinar: Exploring the Aggregation Framework
Webinar: Exploring the Aggregation Framework
 
Building your first app with mongo db
Building your first app with mongo dbBuilding your first app with mongo db
Building your first app with mongo db
 
MongoDB Europe 2016 - MongoDB, Ops Manager & Docker at SNCF
MongoDB Europe 2016 - MongoDB, Ops Manager & Docker at SNCFMongoDB Europe 2016 - MongoDB, Ops Manager & Docker at SNCF
MongoDB Europe 2016 - MongoDB, Ops Manager & Docker at SNCF
 
MongoDB Europe 2016 - Using MongoDB to Build a Fast and Scalable Content Repo...
MongoDB Europe 2016 - Using MongoDB to Build a Fast and Scalable Content Repo...MongoDB Europe 2016 - Using MongoDB to Build a Fast and Scalable Content Repo...
MongoDB Europe 2016 - Using MongoDB to Build a Fast and Scalable Content Repo...
 
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...
 
MongoDB Europe 2016 - Debugging MongoDB Performance
MongoDB Europe 2016 - Debugging MongoDB PerformanceMongoDB Europe 2016 - Debugging MongoDB Performance
MongoDB Europe 2016 - Debugging MongoDB Performance
 
MongoDB Europe 2016 - Deploying MongoDB on NetApp storage
MongoDB Europe 2016 - Deploying MongoDB on NetApp storageMongoDB Europe 2016 - Deploying MongoDB on NetApp storage
MongoDB Europe 2016 - Deploying MongoDB on NetApp storage
 
Data Processing and Aggregation with MongoDB
Data Processing and Aggregation with MongoDB Data Processing and Aggregation with MongoDB
Data Processing and Aggregation with MongoDB
 
MongoDB Europe 2016 - Graph Operations with MongoDB
MongoDB Europe 2016 - Graph Operations with MongoDBMongoDB Europe 2016 - Graph Operations with MongoDB
MongoDB Europe 2016 - Graph Operations with MongoDB
 
MongoDB Europe 2016 - Choosing Between 100 Billion Travel Options – Instant S...
MongoDB Europe 2016 - Choosing Between 100 Billion Travel Options – Instant S...MongoDB Europe 2016 - Choosing Between 100 Billion Travel Options – Instant S...
MongoDB Europe 2016 - Choosing Between 100 Billion Travel Options – Instant S...
 
MongoDB Europe 2016 - Welcome
MongoDB Europe 2016 - WelcomeMongoDB Europe 2016 - Welcome
MongoDB Europe 2016 - Welcome
 
MongoDB and Spring - Two leaves of a same tree
MongoDB and Spring - Two leaves of a same treeMongoDB and Spring - Two leaves of a same tree
MongoDB and Spring - Two leaves of a same tree
 
MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?
 
MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)
MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)
MongoDB Schema Design (Richard Kreuter's Mongo Berlin preso)
 
Building Your First Application with MongoDB
Building Your First Application with MongoDBBuilding Your First Application with MongoDB
Building Your First Application with MongoDB
 
Introduction to mongoDB
Introduction to mongoDBIntroduction to mongoDB
Introduction to mongoDB
 
Agile Schema Design: An introduction to MongoDB
Agile Schema Design: An introduction to MongoDBAgile Schema Design: An introduction to MongoDB
Agile Schema Design: An introduction to MongoDB
 
MongoDB Launchpad 2016: Moving Cybersecurity to the Cloud
MongoDB Launchpad 2016: Moving Cybersecurity to the CloudMongoDB Launchpad 2016: Moving Cybersecurity to the Cloud
MongoDB Launchpad 2016: Moving Cybersecurity to the Cloud
 
MongoDB Europe 2016 - Star in a Reasonably Priced Car - Which Driver is Best?
MongoDB Europe 2016 - Star in a Reasonably Priced Car - Which Driver is Best?MongoDB Europe 2016 - Star in a Reasonably Priced Car - Which Driver is Best?
MongoDB Europe 2016 - Star in a Reasonably Priced Car - Which Driver is Best?
 

Similar to MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

Old Oracle Versions
Old Oracle VersionsOld Oracle Versions
Old Oracle Versions
Jeffrey Kemp
 
ComputeFest 2012: Intro To R for Physical Sciences
ComputeFest 2012: Intro To R for Physical SciencesComputeFest 2012: Intro To R for Physical Sciences
ComputeFest 2012: Intro To R for Physical Sciences
alexstorer
 

Similar to MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines (20)

Getting started with apache solr
Getting started with apache solrGetting started with apache solr
Getting started with apache solr
 
Eve - REST API for Humans™
Eve - REST API for Humans™Eve - REST API for Humans™
Eve - REST API for Humans™
 
So MANY databases, which one do I pick?
So MANY databases, which one do I pick?So MANY databases, which one do I pick?
So MANY databases, which one do I pick?
 
OakTable World 2015 - Using XMLType content with the Oracle In-Memory Column...
OakTable World 2015  - Using XMLType content with the Oracle In-Memory Column...OakTable World 2015  - Using XMLType content with the Oracle In-Memory Column...
OakTable World 2015 - Using XMLType content with the Oracle In-Memory Column...
 
Elasticsearch in 15 minutes
Elasticsearch in 15 minutesElasticsearch in 15 minutes
Elasticsearch in 15 minutes
 
Old Oracle Versions
Old Oracle VersionsOld Oracle Versions
Old Oracle Versions
 
N1QL+GSI: Language and Performance Improvements in Couchbase 5.0 and 5.5
N1QL+GSI: Language and Performance Improvements in Couchbase 5.0 and 5.5N1QL+GSI: Language and Performance Improvements in Couchbase 5.0 and 5.5
N1QL+GSI: Language and Performance Improvements in Couchbase 5.0 and 5.5
 
Complex queries in a distributed multi-model database
Complex queries in a distributed multi-model databaseComplex queries in a distributed multi-model database
Complex queries in a distributed multi-model database
 
ComputeFest 2012: Intro To R for Physical Sciences
ComputeFest 2012: Intro To R for Physical SciencesComputeFest 2012: Intro To R for Physical Sciences
ComputeFest 2012: Intro To R for Physical Sciences
 
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right WayMongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way
 
Regexp Master
Regexp MasterRegexp Master
Regexp Master
 
Online | MongoDB Atlas on GCP Workshop
Online | MongoDB Atlas on GCP Workshop Online | MongoDB Atlas on GCP Workshop
Online | MongoDB Atlas on GCP Workshop
 
Killing ETL with Apache Drill
Killing ETL with Apache DrillKilling ETL with Apache Drill
Killing ETL with Apache Drill
 
(BDT203) From Zero to NoSQL Hero: Amazon DynamoDB Tutorial | AWS re:Invent 2014
(BDT203) From Zero to NoSQL Hero: Amazon DynamoDB Tutorial | AWS re:Invent 2014(BDT203) From Zero to NoSQL Hero: Amazon DynamoDB Tutorial | AWS re:Invent 2014
(BDT203) From Zero to NoSQL Hero: Amazon DynamoDB Tutorial | AWS re:Invent 2014
 
Optimizing MongoDB: Lessons Learned at Localytics
Optimizing MongoDB: Lessons Learned at LocalyticsOptimizing MongoDB: Lessons Learned at Localytics
Optimizing MongoDB: Lessons Learned at Localytics
 
Metadat standards comparison
Metadat standards comparisonMetadat standards comparison
Metadat standards comparison
 
MySQL Integral DB Design #JAB14
MySQL Integral DB Design #JAB14MySQL Integral DB Design #JAB14
MySQL Integral DB Design #JAB14
 
Relational Database to Apache Spark (and sometimes back again)
Relational Database to Apache Spark (and sometimes back again)Relational Database to Apache Spark (and sometimes back again)
Relational Database to Apache Spark (and sometimes back again)
 
Still using MySQL? Maybe you should reconsider.
Still using MySQL? Maybe you should reconsider.Still using MySQL? Maybe you should reconsider.
Still using MySQL? Maybe you should reconsider.
 
Developing and Deploying Edge Analytics with Redis
Developing and Deploying Edge Analytics with RedisDeveloping and Deploying Edge Analytics with Redis
Developing and Deploying Edge Analytics with Redis
 

More from MongoDB

More from MongoDB (20)

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
 

Recently uploaded

Al Barsha Escorts $#$ O565212860 $#$ Escort Service In Al Barsha
Al Barsha Escorts $#$ O565212860 $#$ Escort Service In Al BarshaAl Barsha Escorts $#$ O565212860 $#$ Escort Service In Al Barsha
Al Barsha Escorts $#$ O565212860 $#$ Escort Service In Al Barsha
AroojKhan71
 
Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...
amitlee9823
 
Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...
amitlee9823
 
Call Girls Jalahalli Just Call 👗 7737669865 👗 Top Class Call Girl Service Ban...
Call Girls Jalahalli Just Call 👗 7737669865 👗 Top Class Call Girl Service Ban...Call Girls Jalahalli Just Call 👗 7737669865 👗 Top Class Call Girl Service Ban...
Call Girls Jalahalli Just Call 👗 7737669865 👗 Top Class Call Girl Service Ban...
amitlee9823
 
Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...
Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...
Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...
amitlee9823
 
Call Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service BangaloreCall Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
amitlee9823
 
Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...
Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...
Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...
amitlee9823
 
FESE Capital Markets Fact Sheet 2024 Q1.pdf
FESE Capital Markets Fact Sheet 2024 Q1.pdfFESE Capital Markets Fact Sheet 2024 Q1.pdf
FESE Capital Markets Fact Sheet 2024 Q1.pdf
MarinCaroMartnezBerg
 

Recently uploaded (20)

Al Barsha Escorts $#$ O565212860 $#$ Escort Service In Al Barsha
Al Barsha Escorts $#$ O565212860 $#$ Escort Service In Al BarshaAl Barsha Escorts $#$ O565212860 $#$ Escort Service In Al Barsha
Al Barsha Escorts $#$ O565212860 $#$ Escort Service In Al Barsha
 
Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Thane West Call On 9920725232 With Body to body massage...
 
Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...
Vip Mumbai Call Girls Marol Naka Call On 9920725232 With Body to body massage...
 
Call Girls Jalahalli Just Call 👗 7737669865 👗 Top Class Call Girl Service Ban...
Call Girls Jalahalli Just Call 👗 7737669865 👗 Top Class Call Girl Service Ban...Call Girls Jalahalli Just Call 👗 7737669865 👗 Top Class Call Girl Service Ban...
Call Girls Jalahalli Just Call 👗 7737669865 👗 Top Class Call Girl Service Ban...
 
Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...
Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...
Call Girls Bommasandra Just Call 👗 7737669865 👗 Top Class Call Girl Service B...
 
Capstone Project on IBM Data Analytics Program
Capstone Project on IBM Data Analytics ProgramCapstone Project on IBM Data Analytics Program
Capstone Project on IBM Data Analytics Program
 
Call Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service BangaloreCall Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Begur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
 
Call me @ 9892124323 Cheap Rate Call Girls in Vashi with Real Photo 100% Secure
Call me @ 9892124323  Cheap Rate Call Girls in Vashi with Real Photo 100% SecureCall me @ 9892124323  Cheap Rate Call Girls in Vashi with Real Photo 100% Secure
Call me @ 9892124323 Cheap Rate Call Girls in Vashi with Real Photo 100% Secure
 
Call Girls in Sarai Kale Khan Delhi 💯 Call Us 🔝9205541914 🔝( Delhi) Escorts S...
Call Girls in Sarai Kale Khan Delhi 💯 Call Us 🔝9205541914 🔝( Delhi) Escorts S...Call Girls in Sarai Kale Khan Delhi 💯 Call Us 🔝9205541914 🔝( Delhi) Escorts S...
Call Girls in Sarai Kale Khan Delhi 💯 Call Us 🔝9205541914 🔝( Delhi) Escorts S...
 
Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...
Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...
Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...
 
ALSO dropshipping via API with DroFx.pptx
ALSO dropshipping via API with DroFx.pptxALSO dropshipping via API with DroFx.pptx
ALSO dropshipping via API with DroFx.pptx
 
FESE Capital Markets Fact Sheet 2024 Q1.pdf
FESE Capital Markets Fact Sheet 2024 Q1.pdfFESE Capital Markets Fact Sheet 2024 Q1.pdf
FESE Capital Markets Fact Sheet 2024 Q1.pdf
 
Discover Why Less is More in B2B Research
Discover Why Less is More in B2B ResearchDiscover Why Less is More in B2B Research
Discover Why Less is More in B2B Research
 
Edukaciniai dropshipping via API with DroFx
Edukaciniai dropshipping via API with DroFxEdukaciniai dropshipping via API with DroFx
Edukaciniai dropshipping via API with DroFx
 
Midocean dropshipping via API with DroFx
Midocean dropshipping via API with DroFxMidocean dropshipping via API with DroFx
Midocean dropshipping via API with DroFx
 
April 2024 - Crypto Market Report's Analysis
April 2024 - Crypto Market Report's AnalysisApril 2024 - Crypto Market Report's Analysis
April 2024 - Crypto Market Report's Analysis
 
Digital Advertising Lecture for Advanced Digital & Social Media Strategy at U...
Digital Advertising Lecture for Advanced Digital & Social Media Strategy at U...Digital Advertising Lecture for Advanced Digital & Social Media Strategy at U...
Digital Advertising Lecture for Advanced Digital & Social Media Strategy at U...
 
BabyOno dropshipping via API with DroFx.pptx
BabyOno dropshipping via API with DroFx.pptxBabyOno dropshipping via API with DroFx.pptx
BabyOno dropshipping via API with DroFx.pptx
 
(NEHA) Call Girls Katra Call Now 8617697112 Katra Escorts 24x7
(NEHA) Call Girls Katra Call Now 8617697112 Katra Escorts 24x7(NEHA) Call Girls Katra Call Now 8617697112 Katra Escorts 24x7
(NEHA) Call Girls Katra Call Now 8617697112 Katra Escorts 24x7
 
Week-01-2.ppt BBB human Computer interaction
Week-01-2.ppt BBB human Computer interactionWeek-01-2.ppt BBB human Computer interaction
Week-01-2.ppt BBB human Computer interaction
 

MongoDB Europe 2016 - Advanced MongoDB Aggregation Pipelines

  • 2. { "About me" : { "Name" : "Tom Schreiber", "Title" : "Senior Consulting Engineer", "Email" : "tom.schreiber@mongodb.com", "Twitter" : "@SchreiberTom1", "Location" : "London, UK" } }
  • 3.
  • 4.
  • 5. "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
  • 6. 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."
  • 7. A Highly Composable Compute Pipeline MongoDB Aggregation Framework $sum$match
  • 8. A Highly Composable Compute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match
  • 9. A Highly Composable Compute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match
  • 10. A Highly Composable Compute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match Notions of computation and monads Eugenio Moggi∗ Abstract The λ-calculus is considered an useful mathematical tool in the study of programming languages, since programs can be identified with λ-terms. However, if one goes further and uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced (programs are identified with total functions from values to values), that may jeopardise the applicability of theoretical results. In this paper we introduce calculi based on a categorical semantics for computations, that provide a correct basis for proving equivalence of programs, for a wide range of notions of computation.
  • 11. A Highly Composable Compute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match Notions of computation and monads Eugenio Moggi∗ Abstract The λ-calculus is considered an useful mathematical tool in the study of programming languages, since programs can be identified with λ-terms. However, if one goes further and uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced (programs are identified with total functions from values to values), that may jeopardise the applicability of theoretical results. In this paper we introduce calculi based on a categorical semantics for computations, that provide a correct basis for proving equivalence of programs, for a wide range of notions of computation. A monad defines what it means to chain operations together. 
 This allows the programmer to build pipelines that process data in a series of steps […]
 Monads allow a programming style where programs are written by putting together highly composable parts […]
  • 12. A Highly Composable Compute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match Notions of computation and monads Eugenio Moggi∗ Abstract The λ-calculus is considered an useful mathematical tool in the study of programming languages, since programs can be identified with λ-terms. However, if one goes further and uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced (programs are identified with total functions from values to values), that may jeopardise the applicability of theoretical results. In this paper we introduce calculi based on a categorical semantics for computations, that provide a correct basis for proving equivalence of programs, for a wide range of notions of computation. A monad defines what it means to chain operations together. 
 This allows the programmer to build pipelines that process data in a series of steps […]
 Monads allow a programming style where programs are written by putting together highly composable parts […] Ruby Module Enumerable: collect, select, group_by, … C# / LINQ IEnumerable<T>: Select, Where, GroupBy, … Java Stream<T>: collect,filter,groupingBy,… MongoDB Aggregation Framework: $project, $match, $group, … map, filter, group, … Haskell Module Data.List:
  • 13. A Highly Composable Compute Pipeline 3 4 3 13 6 4 6 3 6 4 MongoDB Aggregation Framework $sum$match
  • 14. Aggregation Pipelines (1) are one of the easiest ways to work with your data. (2) are highly scalable and optimised for performance. (3) are (much) more capable and powerful than you think! 3 4 3 13 6 4 6 3 6 4 $sum$match
  • 15. 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!
  • 16. 1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 DB Land
  • 17. 1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 DB Land
  • 18. 1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement select id, name, dpt, sal from emps where sal = (select max(sal) from emps as e where e.dpt = emps.dpt) or sal = (select max(sal) from emps as e where e.dpt = emps.dpt and sal < (select max(sal) from emps as e2 where e2.dpt = emps.dpt)); DB Land
  • 19. 1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement select r.id, r.name, r.dpt, r.sal
 from (select id, name, dept, sal,
 rank()
 OVER (PARTITION BY dpt
 ORDER BY sal DESC) as rank
 from emps) AS r
 where r.rank <= 2
 order by r.dpt, r.rank 1 Alex DE 300 3 Cora DE 200 5 Erik US 400 6 Fred US 300 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL DB Land
  • 20. 1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement 1 Alex DE 300 3 Cora DE 200 5 Erik US 400 6 Fred US 300 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 ? DB Land
  • 21. 1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL The two top paid employees per departement 1 Alex DE 300 3 Cora DE 200 5 Erik US 400 6 Fred US 300 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 ? "Data should be easy to work with." "The data should serve you. You should not serve the data." "The same (data-) model in your head, in your code, and in your data - NO impedance mismatch." DB Land
  • 22. 1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL DB LandPL Land
  • 23. PL Land 1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 ID NAME DPT SAL DB Land
  • 24. PL Land {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]] {"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, {"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},, {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, {"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},, {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, {"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ DB Land
  • 25. PL Land {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]] {"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, {"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},, {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, {"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},, {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, {"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by take Ruby DB Land
  • 26. PL Land emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by take {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]] {"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, {"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},, {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, {"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},, {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, {"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ Ruby DB Land
  • 27. PL Land }, [{"DE"=> ] ] ] [ [ [ [{"US"=> [{"NL"=> [{"UK"=> }, }, ] emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by take {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]] {"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, {"id"=> 7, "name"=>"Gina", "dpt"=>"US", "sal"=>200},, {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, {"id"=> 4, "name"=>"Drew", "dpt"=>"US", "sal"=>200},, {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, {"id"=> 2, "name"=>"Bert", "dpt"=>"DE", "sal"=>100},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ Ruby DB Land
  • 28. PL Land },{"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},,[[{"NL"=> {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},,[[{"US"=> }, [{"DE"=> {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ }, {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]][[{"UK"=> ] emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by take ] ]] ]] Ruby DB Land
  • 29. PL Land emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}takecollect group_by sort_by },{"id"=> 9, "name"=>"Ivan", "dpt"=>"NL", "sal"=>400},, {"id"=> 8, "name"=>"Herb", "dpt"=>"NL", "sal"=>600},, ] [[{"NL"=> {"id"=> 6, "name"=>"Fred", "dpt"=>"US", "sal"=>300},, {"id"=> 5, "name"=>"Erik", "dpt"=>"US", "sal"=>400},, ] [[{"US"=> }, [{"DE"=> {"id"=> 3, "name"=>"Cora", "dpt"=>"DE", "sal"=>200},, [{"id"=> 1, "name"=>"Alex", "dpt"=>"DE", "sal"=>300},,[ ] }, {"id"=>10, "name"=>"Jill", "dpt"=>"UK", "sal"=>500}]][[{"UK"=> ] 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 Ruby DB Land
  • 30. emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by Ruby PL Land emps.sorted(Comparator.comparing(Employee::getDpt) .thenComparing(Employee::getSal) .reversed()).collect(Collectors
 .groupingBy(Employee::getDpt, Collectors
 .collectingAndThen(Collectors.toList(),l->l.stream() .limit(2).collect( Collectors.toList())))); emps.OrderBy(e => e.Dpt).ThenByDescending(e => e.Sal) .GroupBy(e => e.Dpt) .Select(g => new {Key = g.Key, Emps = g.Take(2)}) C# / LINQ Java Streams take DB Land
  • 31. PL Land emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}takecollect group_by $sort Ruby DB Land
  • 32. PL Land emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}takecollect $sort $group Ruby DB Land
  • 33. PL Land emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}take $sort $group $project Ruby DB Land
  • 34. PL Land emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]} $sort $group $project $slice Ruby DB Land
  • 35. PL Land db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
  • 36. PL Land db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land $project $slice $group$sort
  • 37. MongoDB PL Land db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline PL Land DB Land $project $slice $group$sort
  • 38. MongoDB PL Land {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"_id": 7, "name":"Gina", "dpt":"US", "sal":200}, {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"_id": 4, "name":"Drew", "dpt":"US", "sal":200}, {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, {"_id": 2, "name":"Bert", "dpt":"DE", "sal":100}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
  • 39. MongoDB PL Land {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"_id": 7, "name":"Gina", "dpt":"US", "sal":200}, {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"_id": 4, "name":"Drew", "dpt":"US", "sal":200}, {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, {"_id": 2, "name":"Bert", "dpt":"DE", "sal":100}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
  • 40. MongoDB PL Land {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"_id": 7, "name":"Gina", "dpt":"US", "sal":200}, {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"_id": 4, "name":"Drew", "dpt":"US", "sal":200}, {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, {"_id": 2, "name":"Bert", "dpt":"DE", "sal":100}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, [{"_id" :"DE", "emps": }, {"_id" :"US", "emps": }, {"_id" :"NL", "emps": }, {"_id" :"UK", "emps": ] ] ] }] [ [ [ db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
  • 41. MongoDB PL Land {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps": }] [ [ [ db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline DB Land
  • 42. MongoDB PL Land {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps": }] [ [ [ db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 Aggregation Pipeline DB Land
  • 43. MongoDB PL Land {"_id": 3, "name":"Cora", "dpt":"DE", "sal":200}, [{"_id": 1, "name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"_id": 6, "name":"Fred", "dpt":"US", "sal":300}, {"_id": 5, "name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"_id": 9, "name":"Ivan", "dpt":"NL", "sal":400}, {"_id": 8, "name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"_id":10, "name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps": }] [ [ [ db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice 1 Alex DE 300 3 Cora DE 200 DE US 5 Erik US 400 6 Fred US 300 NL 8 Herb NL 600 9 Ivan NL 400 UK 10 Jill UK 500 "Data should be easy to work with." "The data should serve you. You should not serve the data." "The same (data-) model in your head, in your code, and in your data - NO impedance mismatch." Aggregation Pipeline DB Land
  • 44. MongoDB db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ]) $sort $group $project $slice Aggregation Pipeline emps.OrderBy(e => e.Dpt).ThenByDescending(e => e.Sal) .GroupBy(e => e.Dpt) .Select(g => new {Key = g.Key, Emps = g.Take(2)}) C# emps.sorted(Comparator.comparing(Employee::getDpt) .thenComparing(Employee::getSal) .reversed()).collect(Collectors
 .groupingBy(Employee::getDpt, Collectors
 .collectingAndThen(Collectors.toList(),l->l.stream() .limit(2).collect( Collectors.toList())))); Java emps. {|e| [e["dpt"], -e["sal"]]} . {|e| e["dpt"]} . {|k,v| [k => v. (2)]}collect group_by sort_by Ruby take DB LandPL Land
  • 45. Aggregation Pipelines (1) 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!
  • 46. 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) !
  • 48. λ 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
  • 49. PL Land DB Land Q
  • 50. 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
  • 51. PL Land DB Land Q 100M 5 GB 2 GB 2 h - OOM 5 m
  • 52. 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
  • 53. DB Land 100M 5 GB 2 GB 2 h - OOM 5 m db.emps.aggregate([ { : {dpt:1, sal:-1}}, { : {_id:"$dpt", emps:{$push: "$$CURRENT"}}}, { : {dpt:"$_id", emps:{ : ["$emps",2]}}} ] $slice ) $project $group $sort $project $group $sort 5 GB"errmsg":"Exceeded memory limit for $group, but didn't allow external sort.
 Pass allowDiskUse:true to opt in."
  • 54. 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}
  • 55. 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
  • 56. 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 !
  • 57. 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 !
  • 58. 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")
  • 59. 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})
  • 60. !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
  • 61. DB Land 100M 5 GB 2 GB 2 h - OOM 5 m $project $group $sort 5 GB
  • 62. 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
  • 63. 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
  • 64. DB Land {"name":"Cora", "dpt":"DE", "sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} ])
  • 65. DB Land {"name":"Cora", "dpt":"DE", "sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ])
  • 66. DB Land {"name":"Cora", "dpt":"DE", "sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ])
  • 67. DB Land {"name":"Cora", "dpt":"DE", "sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ])
  • 68. DB Land {"name":"Cora", "dpt":"DE", "sal":200}, {"name":"Alex", "dpt":"DE", "sal":300}, [{"dpt" :"DE", "emps": },] {"name":"Fred", "dpt":"US", "sal":300}, {"name":"Erik", "dpt":"US", "sal":400}, {"dpt" :"US", "emps": },] {"name":"Ivan", "dpt":"NL", "sal":400}, {"name":"Herb", "dpt":"NL", "sal":600}, {"dpt" :"NL", "emps": },] {"name":"Jill", "dpt":"UK", "sal":500}] {"dpt" :"UK", "emps" }] [ [ [ db.emps.aggregate([ ] [ {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true})
  • 69. db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land
  • 70. db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land
  • 71. {
 "stages": [
 {
 "$cursor": {
 "query": {
 "dpt": "DE"
 },
 "sort": {
 "dpt": 1,
 "sal": -1
 },
 "fields": {
 "dpt": 1,
 "name": 1,
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land
  • 72. {
 "stages": [
 {
 "$cursor": {
 "query": {
 "dpt": "DE"
 },
 "sort": {
 "dpt": 1,
 "sal": -1
 },
 "fields": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land
  • 73. {
 "stages": [
 {
 "$cursor": {
 "query": {
 "dpt": "DE"
 },
 "sort": {
 "dpt": 1,
 "sal": -1
 },
 "fields": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $cursor
  • 74. ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 "rejectedPlans": []
 }
 }
 },
 {
 "$group": {
 "_id": "$dpt",
 "emps": {
 "$push": {
 "name": "$name",
 "sal": "$sal"
 }
 }
 }
 },
 {
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $cursor
  • 75. ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 "rejectedPlans": []
 }
 }
 },
 {
 "$group": {
 "_id": "$dpt",
 "emps": {
 "$push": {
 "name": "$name",
 "sal": "$sal"
 }
 }
 }
 },
 {
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $cursor
  • 76. "_id": "$dpt",
 "emps": {
 "$push": {
 "name": "$name",
 "sal": "$sal"
 }
 }
 }
 },
 {
 "$project": {
 "_id": false,
 "dpt": "$_id",
 "emps": {
 "$slice": [
 "$emps",
 {
 "$const": 2
 }
 ]
 }
 }
 }
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $cursor
  • 77. "_id": "$dpt",
 "emps": {
 "$push": {
 "name": "$name",
 "sal": "$sal"
 }
 }
 }
 },
 {
 "$project": {
 "_id": false,
 "dpt": "$_id",
 "emps": {
 "$slice": [
 "$emps",
 {
 "$const": 2
 }
 ]
 }
 }
 }
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor
  • 78. "queryPlanner": {
 "plannerVersion": 1,
 "namespace": "DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor
  • 79. "queryPlanner": {
 "plannerVersion": 1,
 "namespace": "DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION
  • 80. "multiKeyPaths": {
 "dpt": [],
 "sal": [],
 "name": []
 },
 "isUnique": false,
 "isSparse": false,
 "isPartial": false,
 "indexVersion": 2,
 "direction": "forward",
 "indexBounds": {
 "dpt": [
 "["DE", "DE"]"
 ],
 "sal": [
 "[MaxKey, MinKey]"
 ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION
  • 81. "multiKeyPaths": {
 "dpt": [],
 "sal": [],
 "name": []
 },
 "isUnique": false,
 "isSparse": false,
 "isPartial": false,
 "indexVersion": 2,
 "direction": "forward",
 "indexBounds": {
 "dpt": [
 "["DE", "DE"]"
 ],
 "sal": [
 "[MaxKey, MinKey]"
 ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting
  • 82. "multiKeyPaths": {
 "dpt": [],
 "sal": [],
 "name": []
 },
 "isUnique": false,
 "isSparse": false,
 "isPartial": false,
 "indexVersion": 2,
 "direction": "forward",
 "indexBounds": {
 "dpt": [
 "["DE", "DE"]"
 ],
 "sal": [
 "[MaxKey, MinKey]"
 ],
 "name": [
 "[MinKey, MaxKey]"
 ]
 }
 }
 },
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting Pipeline Reordering: Index used for matching
  • 83. "queryPlanner": {
 "plannerVersion": 1,
 "namespace": "DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting Pipeline Reordering: Index used for matching
  • 84. "queryPlanner": {
 "plannerVersion": 1,
 "namespace": "DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting Pipeline Reordering: Index used for matching Projection Optimization: Query turned to Covered Query
  • 85. "queryPlanner": {
 "plannerVersion": 1,
 "namespace": "DB.emps",
 "indexFilterSet": false,
 "parsedQuery": {
 "dpt": {
 "$eq": "DE"
 }
 },
 "winningPlan": {
 "stage": "PROJECTION",
 "transformBy": {
 "dpt": 1,
 "name": 1,
 "sal": 1,
 "_id": 0
 },
 "inputStage": {
 "stage": "IXSCAN",
 "keyPattern": {
 "dpt": 1,
 "sal": -1,
 "name": 1
 db.emps.aggregate([ ] {$sort: {dpt:1,sal:-1}}, {$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}}, {$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}} {$match: {dpt:"DE"}}, ,{explain:true}) DB Land $group $project $cursor IXSCAN Index on
 "dpt":1, "sal":-1, "name":1 PROJECTION Index used for sorting Pipeline Reordering: Index used for matching Projection Optimization: Query turned to Covered Query
  • 86. DB Land Aggregation Pipelines (1) are one of the easiest ways to work with your data. (2) are highly scalable and optimised for performance. (3) are (much) more capable and powerful than you think!
  • 87. 1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 DB Land _id name dpt sal
  • 88. 1 Alex DE 300 2 Bert DE 100 3 Cora DE 200 4 Drew US 200 5 Erik US 400 6 Fred US 300 7 Gina US 200 8 Herb NL 600 9 Ivan NL 400 10 Jill UK 500 DB Land _id name dpt sal 10 3 1 6 10 5 5 10 8 bid
  • 89. 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
  • 90. 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
  • 91. 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"
  • 92. 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"
  • 93. 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"
  • 94. 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"
  • 95. 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"
  • 96. 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"
  • 97. 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"
  • 98. 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"
  • 99. 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"
  • 100. 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"
  • 101. 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"
  • 102. 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"
  • 103. 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"
  • 104. 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"
  • 105. 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"
  • 106. 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
  • 107. 8 Herb NL 600 10 10 Jill UK 500 5 Erik US 400 105 Erik US 400 10 10 Jill UK 500 6 Fred US 300 5 1 Alex DE 300 10 3 Cora DE 200 1 10 Jill UK 50010 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[]}] ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 108. 8 Herb NL 600 10 10 Jill UK 500 5 Erik US 400 105 Erik US 400 10 10 Jill UK 500 6 Fred US 300 5 1 Alex DE 300 10 3 Cora DE 200 1 10 Jill UK 50010 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[]}] ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 109. 8 Herb NL 600 10 10 Jill UK 500 5 Erik US 400 105 Erik US 400 10 10 Jill UK 500 6 Fred US 300 5 1 Alex DE 300 10 3 Cora DE 200 1 10 Jill UK 50010 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[ { ,"bosses":[]}] ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 110. 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0}[ { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 6 Fred US 300 5 10 Jill UK 500 5 Erik US 400 10 5 Erik US 400 10 10 Jill UK 500 8 Herb NL 600 10 ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 111. 10 Jill UK 50010 Jill UK 50010 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 1 Alex DE 300 10 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0}[ { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[{ ,"lvl":0} { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 6 Fred US 300 5 10 Jill UK 500 5 Erik US 400 10 5 Erik US 400 10 10 Jill UK 500 8 Herb NL 600 10 ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 112. 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0}[ { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 1 Alex DE 300 10 10 Jill UK 500 6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 8 Herb NL 600 10 10 Jill UK 500 ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 113. 10 Jill UK 50010 Jill UK 50010 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0}[ { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 1 Alex DE 300 10 10 Jill UK 500 6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 8 Herb NL 600 10 10 Jill UK 500 ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 114. 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} }] ,[ { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, , { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, , 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 1 Alex DE 300 10 10 Jill UK 500 6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 8 Herb NL 600 10 10 Jill UK 500 }] , }] ,}] , ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 115. 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid 1 Alex DE 300 10 2 Bert DE 100 3 3 Cora DE 200 1 4 Drew US 200 6 5 Erik US 400 10 6 Fred US 300 5 7 Gina US 200 5 8 Herb NL 600 10 9 Ivan NL 400 8 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} }] ,[ { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, , { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, , 10 Jill UK 500 { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[{ ,"lvl":0} { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0}, { ,"bosses":[]}] 3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 1 Alex DE 300 10 10 Jill UK 500 6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 5 Erik US 400 10 10 Jill UK 500 10 Jill UK 500 8 Herb NL 600 10 10 Jill UK 500 }] , }] ,}] , ]}, ]}, ]}, ]}, ]}, ]}, The two employees bosseswith most ]) db.emps.aggregate([ {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 116. 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"
  • 117. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} "bid" "_id""$bid" "bosses" 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid [ 2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]}, 4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]}] The two employees bosseswith most ]) db.emps.aggregate([ , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
  • 118. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl" 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) [ 2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]}, 4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]}] The two employees bosseswith most "bid" "_id""$bid" "bosses"
  • 119. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl" 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employees bosseswith most "bid" "_id""$bid" "bosses"
  • 120. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) "bid" "_id""$bid" "bosses" The two employeesbosses with most "bosses.lvl"
  • 121. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) "bid""_id""$bid" "bosses" The two employeesbosses with most "bosses.lvl"
  • 122. , {$sort:{"bosses.leve:-1}}, {$limit:2} {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "emps" "bosses.lvl" "$_id" "_id" "bid"
  • 123. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "bosses.lvl" "$_id" "_id" "bid" "emps" ,
  • 124. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt"
  • 125. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses.leve:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 126. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 127. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}}, $limit$graphLookup $sort$addFields
  • 128. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 129. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 130. [{ ,"emps":[], "hdcnt":0}] 9 Ivan NL 400 8 [{ ,"emps":[], "hdcnt":0} 7 Gina US 200 5 [{ ,"emps":[], "hdcnt":0} 4 Drew US 200 6 [{ ,"emps":[], "hdcnt":0} 2 Bert DE 100 3 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 8 Herb NL 600 10 9 Ivan NL 400 8 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 6 Fred US 300 5 4 Drew US 200 6 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},
  • 131. [ 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"}}},
  • 132. [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , , { ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , , { ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3 1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10 3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5 9 Ivan NL 400 8 "hdcnt":9}, [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ], "hdcnt":3} [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 3 Cora DE 200 1 2 Bert DE 100 3 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 8 Herb NL 600 10 9 Ivan NL 400 8 [{ ,"emps":[{ ,"lvl":0}], "hdcnt":1}, 6 Fred US 300 5 4 Drew US 200 6 [ { ,"lvl":1}],{ ,"emps":[{ ,"lvl":0}, "hdcnt":2}, 1 Alex DE 300 10 3 Cora DE 200 1 2 Bert DE 100 3 , 10 Jill UK 500 _id name dpt sal bid 5 Erik US 400 10 _id name dpt sal bid 7 Gina US 200 5 _id name dpt sal bid 6 Fred US 300 5 _id name dpt sal bid 9 Ivan NL 400 8 _id name dpt sal bid 8 Herb NL 600 10 _id name dpt sal bid 1 Alex DE 300 10 _id name dpt sal bid 3 Cora DE 200 1 _id name dpt sal bid 2 Bert DE 100 3 _id name dpt sal bid 4 Drew US 200 6 _id name dpt sal bid {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
 dpthField:"lvl", as:"bosses"}} , {$sort:{"bosses:-1}}, {$limit:2} db.emps.aggregate([ ]) The two employeesbosses with most "$_id" "_id" "bid" "emps" , "hdcnt" {$addFields: {hdcnt:{$size:"$emps"}}},