SlideShare une entreprise Scribd logo
1  sur  231
Télécharger pour lire hors ligne
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"}}},
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines

Contenu connexe

En vedette

OPENEXPO Madrid 2015 - Advanced Applications with MongoDB
OPENEXPO Madrid 2015 - Advanced Applications with MongoDB OPENEXPO Madrid 2015 - Advanced Applications with MongoDB
OPENEXPO Madrid 2015 - Advanced Applications with MongoDB MongoDB
 
Advanced applications with MongoDB
Advanced applications with MongoDBAdvanced applications with MongoDB
Advanced applications with MongoDBNorberto Leite
 
How To Get Hadoop App Intelligence with Driven
How To Get Hadoop App Intelligence with DrivenHow To Get Hadoop App Intelligence with Driven
How To Get Hadoop App Intelligence with DrivenCascading
 
Data Treatment MongoDB
Data Treatment MongoDBData Treatment MongoDB
Data Treatment MongoDBNorberto Leite
 
Geospatial and MongoDB
Geospatial and MongoDBGeospatial and MongoDB
Geospatial and MongoDBNorberto Leite
 
MongoDB on Financial Services Sector
MongoDB on Financial Services SectorMongoDB on Financial Services Sector
MongoDB on Financial Services SectorNorberto Leite
 
MongoDB Certification Study Group - May 2016
MongoDB Certification Study Group - May 2016MongoDB Certification Study Group - May 2016
MongoDB Certification Study Group - May 2016Norberto Leite
 
From Monolithic to Microservices in 45 Minutes
From Monolithic to Microservices in 45 MinutesFrom Monolithic to Microservices in 45 Minutes
From Monolithic to Microservices in 45 MinutesMongoDB
 
How Financial Services Organizations Use MongoDB
How Financial Services Organizations Use MongoDBHow Financial Services Organizations Use MongoDB
How Financial Services Organizations Use MongoDBMongoDB
 
Retail Reference Architecture
Retail Reference ArchitectureRetail Reference Architecture
Retail Reference ArchitectureMongoDB
 

En vedette (15)

OPENEXPO Madrid 2015 - Advanced Applications with MongoDB
OPENEXPO Madrid 2015 - Advanced Applications with MongoDB OPENEXPO Madrid 2015 - Advanced Applications with MongoDB
OPENEXPO Madrid 2015 - Advanced Applications with MongoDB
 
Analyse Yourself
Analyse YourselfAnalyse Yourself
Analyse Yourself
 
Advanced applications with MongoDB
Advanced applications with MongoDBAdvanced applications with MongoDB
Advanced applications with MongoDB
 
Data Distribution Theory
Data Distribution TheoryData Distribution Theory
Data Distribution Theory
 
How To Get Hadoop App Intelligence with Driven
How To Get Hadoop App Intelligence with DrivenHow To Get Hadoop App Intelligence with Driven
How To Get Hadoop App Intelligence with Driven
 
Data Treatment MongoDB
Data Treatment MongoDBData Treatment MongoDB
Data Treatment MongoDB
 
MongoDB + Spring
MongoDB + SpringMongoDB + Spring
MongoDB + Spring
 
Geospatial and MongoDB
Geospatial and MongoDBGeospatial and MongoDB
Geospatial and MongoDB
 
MongoDB and Python
MongoDB and PythonMongoDB and Python
MongoDB and Python
 
MongoDB and Node.js
MongoDB and Node.jsMongoDB and Node.js
MongoDB and Node.js
 
MongoDB on Financial Services Sector
MongoDB on Financial Services SectorMongoDB on Financial Services Sector
MongoDB on Financial Services Sector
 
MongoDB Certification Study Group - May 2016
MongoDB Certification Study Group - May 2016MongoDB Certification Study Group - May 2016
MongoDB Certification Study Group - May 2016
 
From Monolithic to Microservices in 45 Minutes
From Monolithic to Microservices in 45 MinutesFrom Monolithic to Microservices in 45 Minutes
From Monolithic to Microservices in 45 Minutes
 
How Financial Services Organizations Use MongoDB
How Financial Services Organizations Use MongoDBHow Financial Services Organizations Use MongoDB
How Financial Services Organizations Use MongoDB
 
Retail Reference Architecture
Retail Reference ArchitectureRetail Reference Architecture
Retail Reference Architecture
 

Similaire à Advanced MongoDB Aggregation Pipelines

Getting started with apache solr
Getting started with apache solrGetting started with apache solr
Getting started with apache solrHumayun Kabir
 
Eve - REST API for Humans™
Eve - REST API for Humans™Eve - REST API for Humans™
Eve - REST API for Humans™Nicola Iarocci
 
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?kristinferrier
 
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...Marco Gralike
 
Elasticsearch in 15 minutes
Elasticsearch in 15 minutesElasticsearch in 15 minutes
Elasticsearch in 15 minutesDavid Pilato
 
Old Oracle Versions
Old Oracle VersionsOld Oracle Versions
Old Oracle VersionsJeffrey Kemp
 
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.5Keshav Murthy
 
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 databaseMax Neunhöffer
 
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 Sciencesalexstorer
 
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 WayMongoDB
 
Online | MongoDB Atlas on GCP Workshop
Online | MongoDB Atlas on GCP Workshop Online | MongoDB Atlas on GCP Workshop
Online | MongoDB Atlas on GCP Workshop Natasha Wilson
 
Killing ETL with Apache Drill
Killing ETL with Apache DrillKilling ETL with Apache Drill
Killing ETL with Apache DrillCharles Givre
 
(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 2014Amazon Web Services
 
Optimizing MongoDB: Lessons Learned at Localytics
Optimizing MongoDB: Lessons Learned at LocalyticsOptimizing MongoDB: Lessons Learned at Localytics
Optimizing MongoDB: Lessons Learned at LocalyticsBenjamin Darfler
 
Metadat standards comparison
Metadat standards comparisonMetadat standards comparison
Metadat standards comparisonhafeezjamali
 
MySQL Integral DB Design #JAB14
MySQL Integral DB Design #JAB14MySQL Integral DB Design #JAB14
MySQL Integral DB Design #JAB14Eli Aschkenasy
 
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)Ed Thewlis
 
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.Radu-Sebastian Amarie
 
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 RedisDavid Rauschenbach
 

Similaire à 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
 

Dernier

Predicting HDB Resale Prices - Conducting Linear Regression Analysis With Orange
Predicting HDB Resale Prices - Conducting Linear Regression Analysis With OrangePredicting HDB Resale Prices - Conducting Linear Regression Analysis With Orange
Predicting HDB Resale Prices - Conducting Linear Regression Analysis With OrangeThinkInnovation
 
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...nirzagarg
 
SAC 25 Final National, Regional & Local Angel Group Investing Insights 2024 0...
SAC 25 Final National, Regional & Local Angel Group Investing Insights 2024 0...SAC 25 Final National, Regional & Local Angel Group Investing Insights 2024 0...
SAC 25 Final National, Regional & Local Angel Group Investing Insights 2024 0...Elaine Werffeli
 
Jual obat aborsi Bandung ( 085657271886 ) Cytote pil telat bulan penggugur ka...
Jual obat aborsi Bandung ( 085657271886 ) Cytote pil telat bulan penggugur ka...Jual obat aborsi Bandung ( 085657271886 ) Cytote pil telat bulan penggugur ka...
Jual obat aborsi Bandung ( 085657271886 ) Cytote pil telat bulan penggugur ka...Klinik kandungan
 
Top profile Call Girls In Latur [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Latur [ 7014168258 ] Call Me For Genuine Models We ...Top profile Call Girls In Latur [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Latur [ 7014168258 ] Call Me For Genuine Models We ...gajnagarg
 
Kings of Saudi Arabia, information about them
Kings of Saudi Arabia, information about themKings of Saudi Arabia, information about them
Kings of Saudi Arabia, information about themeitharjee
 
Dubai Call Girls Peeing O525547819 Call Girls Dubai
Dubai Call Girls Peeing O525547819 Call Girls DubaiDubai Call Girls Peeing O525547819 Call Girls Dubai
Dubai Call Girls Peeing O525547819 Call Girls Dubaikojalkojal131
 
Lecture_2_Deep_Learning_Overview-newone1
Lecture_2_Deep_Learning_Overview-newone1Lecture_2_Deep_Learning_Overview-newone1
Lecture_2_Deep_Learning_Overview-newone1ranjankumarbehera14
 
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...Valters Lauzums
 
Top profile Call Girls In Chandrapur [ 7014168258 ] Call Me For Genuine Model...
Top profile Call Girls In Chandrapur [ 7014168258 ] Call Me For Genuine Model...Top profile Call Girls In Chandrapur [ 7014168258 ] Call Me For Genuine Model...
Top profile Call Girls In Chandrapur [ 7014168258 ] Call Me For Genuine Model...gajnagarg
 
如何办理英国诺森比亚大学毕业证(NU毕业证书)成绩单原件一模一样
如何办理英国诺森比亚大学毕业证(NU毕业证书)成绩单原件一模一样如何办理英国诺森比亚大学毕业证(NU毕业证书)成绩单原件一模一样
如何办理英国诺森比亚大学毕业证(NU毕业证书)成绩单原件一模一样wsppdmt
 
Computer science Sql cheat sheet.pdf.pdf
Computer science Sql cheat sheet.pdf.pdfComputer science Sql cheat sheet.pdf.pdf
Computer science Sql cheat sheet.pdf.pdfSayantanBiswas37
 
Top profile Call Girls In dimapur [ 7014168258 ] Call Me For Genuine Models W...
Top profile Call Girls In dimapur [ 7014168258 ] Call Me For Genuine Models W...Top profile Call Girls In dimapur [ 7014168258 ] Call Me For Genuine Models W...
Top profile Call Girls In dimapur [ 7014168258 ] Call Me For Genuine Models W...gajnagarg
 
TrafficWave Generator Will Instantly drive targeted and engaging traffic back...
TrafficWave Generator Will Instantly drive targeted and engaging traffic back...TrafficWave Generator Will Instantly drive targeted and engaging traffic back...
TrafficWave Generator Will Instantly drive targeted and engaging traffic back...SOFTTECHHUB
 
RESEARCH-FINAL-DEFENSE-PPT-TEMPLATE.pptx
RESEARCH-FINAL-DEFENSE-PPT-TEMPLATE.pptxRESEARCH-FINAL-DEFENSE-PPT-TEMPLATE.pptx
RESEARCH-FINAL-DEFENSE-PPT-TEMPLATE.pptxronsairoathenadugay
 
Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...nirzagarg
 
Nirala Nagar / Cheap Call Girls In Lucknow Phone No 9548273370 Elite Escort S...
Nirala Nagar / Cheap Call Girls In Lucknow Phone No 9548273370 Elite Escort S...Nirala Nagar / Cheap Call Girls In Lucknow Phone No 9548273370 Elite Escort S...
Nirala Nagar / Cheap Call Girls In Lucknow Phone No 9548273370 Elite Escort S...HyderabadDolls
 
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...gajnagarg
 
Vadodara 💋 Call Girl 7737669865 Call Girls in Vadodara Escort service book now
Vadodara 💋 Call Girl 7737669865 Call Girls in Vadodara Escort service book nowVadodara 💋 Call Girl 7737669865 Call Girls in Vadodara Escort service book now
Vadodara 💋 Call Girl 7737669865 Call Girls in Vadodara Escort service book nowgargpaaro
 

Dernier (20)

Predicting HDB Resale Prices - Conducting Linear Regression Analysis With Orange
Predicting HDB Resale Prices - Conducting Linear Regression Analysis With OrangePredicting HDB Resale Prices - Conducting Linear Regression Analysis With Orange
Predicting HDB Resale Prices - Conducting Linear Regression Analysis With Orange
 
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
 
SAC 25 Final National, Regional & Local Angel Group Investing Insights 2024 0...
SAC 25 Final National, Regional & Local Angel Group Investing Insights 2024 0...SAC 25 Final National, Regional & Local Angel Group Investing Insights 2024 0...
SAC 25 Final National, Regional & Local Angel Group Investing Insights 2024 0...
 
Jual obat aborsi Bandung ( 085657271886 ) Cytote pil telat bulan penggugur ka...
Jual obat aborsi Bandung ( 085657271886 ) Cytote pil telat bulan penggugur ka...Jual obat aborsi Bandung ( 085657271886 ) Cytote pil telat bulan penggugur ka...
Jual obat aborsi Bandung ( 085657271886 ) Cytote pil telat bulan penggugur ka...
 
Abortion pills in Jeddah | +966572737505 | Get Cytotec
Abortion pills in Jeddah | +966572737505 | Get CytotecAbortion pills in Jeddah | +966572737505 | Get Cytotec
Abortion pills in Jeddah | +966572737505 | Get Cytotec
 
Top profile Call Girls In Latur [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Latur [ 7014168258 ] Call Me For Genuine Models We ...Top profile Call Girls In Latur [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Latur [ 7014168258 ] Call Me For Genuine Models We ...
 
Kings of Saudi Arabia, information about them
Kings of Saudi Arabia, information about themKings of Saudi Arabia, information about them
Kings of Saudi Arabia, information about them
 
Dubai Call Girls Peeing O525547819 Call Girls Dubai
Dubai Call Girls Peeing O525547819 Call Girls DubaiDubai Call Girls Peeing O525547819 Call Girls Dubai
Dubai Call Girls Peeing O525547819 Call Girls Dubai
 
Lecture_2_Deep_Learning_Overview-newone1
Lecture_2_Deep_Learning_Overview-newone1Lecture_2_Deep_Learning_Overview-newone1
Lecture_2_Deep_Learning_Overview-newone1
 
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...
 
Top profile Call Girls In Chandrapur [ 7014168258 ] Call Me For Genuine Model...
Top profile Call Girls In Chandrapur [ 7014168258 ] Call Me For Genuine Model...Top profile Call Girls In Chandrapur [ 7014168258 ] Call Me For Genuine Model...
Top profile Call Girls In Chandrapur [ 7014168258 ] Call Me For Genuine Model...
 
如何办理英国诺森比亚大学毕业证(NU毕业证书)成绩单原件一模一样
如何办理英国诺森比亚大学毕业证(NU毕业证书)成绩单原件一模一样如何办理英国诺森比亚大学毕业证(NU毕业证书)成绩单原件一模一样
如何办理英国诺森比亚大学毕业证(NU毕业证书)成绩单原件一模一样
 
Computer science Sql cheat sheet.pdf.pdf
Computer science Sql cheat sheet.pdf.pdfComputer science Sql cheat sheet.pdf.pdf
Computer science Sql cheat sheet.pdf.pdf
 
Top profile Call Girls In dimapur [ 7014168258 ] Call Me For Genuine Models W...
Top profile Call Girls In dimapur [ 7014168258 ] Call Me For Genuine Models W...Top profile Call Girls In dimapur [ 7014168258 ] Call Me For Genuine Models W...
Top profile Call Girls In dimapur [ 7014168258 ] Call Me For Genuine Models W...
 
TrafficWave Generator Will Instantly drive targeted and engaging traffic back...
TrafficWave Generator Will Instantly drive targeted and engaging traffic back...TrafficWave Generator Will Instantly drive targeted and engaging traffic back...
TrafficWave Generator Will Instantly drive targeted and engaging traffic back...
 
RESEARCH-FINAL-DEFENSE-PPT-TEMPLATE.pptx
RESEARCH-FINAL-DEFENSE-PPT-TEMPLATE.pptxRESEARCH-FINAL-DEFENSE-PPT-TEMPLATE.pptx
RESEARCH-FINAL-DEFENSE-PPT-TEMPLATE.pptx
 
Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...
 
Nirala Nagar / Cheap Call Girls In Lucknow Phone No 9548273370 Elite Escort S...
Nirala Nagar / Cheap Call Girls In Lucknow Phone No 9548273370 Elite Escort S...Nirala Nagar / Cheap Call Girls In Lucknow Phone No 9548273370 Elite Escort S...
Nirala Nagar / Cheap Call Girls In Lucknow Phone No 9548273370 Elite Escort S...
 
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
 
Vadodara 💋 Call Girl 7737669865 Call Girls in Vadodara Escort service book now
Vadodara 💋 Call Girl 7737669865 Call Girls in Vadodara Escort service book nowVadodara 💋 Call Girl 7737669865 Call Girls in Vadodara Escort service book now
Vadodara 💋 Call Girl 7737669865 Call Girls in Vadodara Escort service book now
 

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