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

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

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

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

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

from (select id, name, dept, sal,

rank()

OVER (PARTITION BY dpt

ORDER BY sal DESC)
as rank

from emps) AS r

where r.rank <= 2

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

.groupingBy(Employee::getDpt, Collectors

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

.groupingBy(Employee::getDpt, Collectors

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

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

"stages": [

{

"$cursor": {

"query": {

"dpt": "DE"

},

"sort": {

"dpt": 1,

"sal": -1

},

"fields": {

"dpt": 1,

"name": 1,

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

"stages": [

{

"$cursor": {

"query": {

"dpt": "DE"

},

"sort": {

"dpt": 1,

"sal": -1

},

"fields": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

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

"stages": [

{

"$cursor": {

"query": {

"dpt": "DE"

},

"sort": {

"dpt": 1,

"sal": -1

},

"fields": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

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

"name": [

"[MinKey, MaxKey]"

]

}

}

},

"rejectedPlans": []

}

}

},

{

"$group": {

"_id": "$dpt",

"emps": {

"$push": {

"name": "$name",

"sal": "$sal"

}

}

}

},

{

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

"name": [

"[MinKey, MaxKey]"

]

}

}

},

"rejectedPlans": []

}

}

},

{

"$group": {

"_id": "$dpt",

"emps": {

"$push": {

"name": "$name",

"sal": "$sal"

}

}

}

},

{

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

"emps": {

"$push": {

"name": "$name",

"sal": "$sal"

}

}

}

},

{

"$project": {

"_id": false,

"dpt": "$_id",

"emps": {

"$slice": [

"$emps",

{

"$const": 2

}

]

}

}

}

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

"emps": {

"$push": {

"name": "$name",

"sal": "$sal"

}

}

}

},

{

"$project": {

"_id": false,

"dpt": "$_id",

"emps": {

"$slice": [

"$emps",

{

"$const": 2

}

]

}

}

}

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

"plannerVersion": 1,

"namespace": "DB.emps",

"indexFilterSet": false,

"parsedQuery": {

"dpt": {

"$eq": "DE"

}

},

"winningPlan": {

"stage": "PROJECTION",

"transformBy": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

"inputStage": {

"stage": "IXSCAN",

"keyPattern": {

"dpt": 1,

"sal": -1,

"name": 1

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

"plannerVersion": 1,

"namespace": "DB.emps",

"indexFilterSet": false,

"parsedQuery": {

"dpt": {

"$eq": "DE"

}

},

"winningPlan": {

"stage": "PROJECTION",

"transformBy": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

"inputStage": {

"stage": "IXSCAN",

"keyPattern": {

"dpt": 1,

"sal": -1,

"name": 1

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

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

"dpt": [],

"sal": [],

"name": []

},

"isUnique": false,

"isSparse": false,

"isPartial": false,

"indexVersion": 2,

"direction": "forward",

"indexBounds": {

"dpt": [

"["DE", "DE"]"

],

"sal": [

"[MaxKey, MinKey]"

],

"name": [

"[MinKey, MaxKey]"

]

}

}

},

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

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

"dpt": [],

"sal": [],

"name": []

},

"isUnique": false,

"isSparse": false,

"isPartial": false,

"indexVersion": 2,

"direction": "forward",

"indexBounds": {

"dpt": [

"["DE", "DE"]"

],

"sal": [

"[MaxKey, MinKey]"

],

"name": [

"[MinKey, MaxKey]"

]

}

}

},

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

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

"dpt": [],

"sal": [],

"name": []

},

"isUnique": false,

"isSparse": false,

"isPartial": false,

"indexVersion": 2,

"direction": "forward",

"indexBounds": {

"dpt": [

"["DE", "DE"]"

],

"sal": [

"[MaxKey, MinKey]"

],

"name": [

"[MinKey, MaxKey]"

]

}

}

},

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

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

"plannerVersion": 1,

"namespace": "DB.emps",

"indexFilterSet": false,

"parsedQuery": {

"dpt": {

"$eq": "DE"

}

},

"winningPlan": {

"stage": "PROJECTION",

"transformBy": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

"inputStage": {

"stage": "IXSCAN",

"keyPattern": {

"dpt": 1,

"sal": -1,

"name": 1

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

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

"plannerVersion": 1,

"namespace": "DB.emps",

"indexFilterSet": false,

"parsedQuery": {

"dpt": {

"$eq": "DE"

}

},

"winningPlan": {

"stage": "PROJECTION",

"transformBy": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

"inputStage": {

"stage": "IXSCAN",

"keyPattern": {

"dpt": 1,

"sal": -1,

"name": 1

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

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

"plannerVersion": 1,

"namespace": "DB.emps",

"indexFilterSet": false,

"parsedQuery": {

"dpt": {

"$eq": "DE"

}

},

"winningPlan": {

"stage": "PROJECTION",

"transformBy": {

"dpt": 1,

"name": 1,

"sal": 1,

"_id": 0

},

"inputStage": {

"stage": "IXSCAN",

"keyPattern": {

"dpt": 1,

"sal": -1,

"name": 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",

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

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

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

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

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

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

dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
db.emps.aggregate([
"$_id" "_id" "bid"
"emps" ,
"hdcnt" ,
{$addFields: {hdcnt:{$size:"$emps"}}},
The two employeesbosses with most
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
The two employeesbosses with most
[ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , ,
{ ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , ,
{ ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3
1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10
3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5
9 Ivan NL 400 8
"hdcnt":9},
[ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ],
"hdcnt":3}
},
]}
, "tsal":2700
, "tsal":700
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
MongoDB
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
_id name dpt sal bid
MongoDB
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
_id name dpt sal bid
Munich
Hamburg
Essen
Chicago
Boston
Orlando
Austin
Utrecht
Arnheim
London
loc
MongoDB
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
Munich
Hamburg
Essen
Chicago
Boston
Orlando
Austin
Utrecht
Arnheim
London
_id name dpt sal bid loc
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
Munich
Hamburg
Essen
Chicago
Boston
Orlando
Austin
Utrecht
Arnheim
London
_id name dpt sal bid loc
Chicago
Boston
Austin
Orlando
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
Munich
Hamburg
Essen
Chicago
Boston
Orlando
Austin
Utrecht
Arnheim
London
_id name dpt sal bid loc
Chicago
Boston
Austin
Orlando
✈
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
Munich
Hamburg
Essen
Chicago
Boston
Orlando
Austin
Utrecht
Arnheim
London
_id name dpt sal bid loc
Chicago
Boston
Austin
Orlando
$
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
Munich
Hamburg
Essen
Chicago
Boston
Orlando
Austin
Utrecht
Arnheim
London
_id name dpt sal bid loc
Chicago
Boston
Austin
Orlando
$
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
Munich
Hamburg
Essen
Chicago
Boston
Orlando
Austin
Utrecht
Arnheim
London
_id name dpt sal bid loc
Chicago
Boston
Austin
Orlando
$
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
Munich
Hamburg
Essen
Chicago
Boston
Orlando
Austin
Utrecht
Arnheim
London
_id name dpt sal bid loc
Chicago
Boston
Austin
Orlando
$
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
Munich
Hamburg
Essen
Chicago
Boston
Orlando
Austin
Utrecht
Arnheim
London
_id name dpt sal bid loc
Chicago
Boston
Austin
Orlando
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
Munich
Hamburg
Essen
Chicago
Boston
Orlando
Austin
Utrecht
Arnheim
London
_id name dpt sal bid loc
$
Chicago
Boston
Austin
Orlando
✈
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
Munich
Hamburg
Essen
Chicago
Boston
Orlando
Austin
Utrecht
Arnheim
London
_id name dpt sal bid loc
Chicago
Boston
Austin
Orlando
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
Munich
Hamburg
Essen
Chicago
Boston
Orlando
Austin
Utrecht
Arnheim
London
_id name dpt sal bid loc
Chicago
Boston
Austin
Orlando
Chicago
Boston
Austin
Orlando
Boston 980 Chicago
Boston 2000 Austin
Boston 1300 Orlando
Chicago 980 Boston
Chicago 1150 Austin
Chicago 1200 Orlando
Austin 2000 Boston
Austin 1150 Chicago
Austin 1100 Orlando
Orlando 1300 Boston
Orlando 1200 Chicago
Orlando 1100 Austin
start enddist
Orlando 1300 BostonBoston 980 ChicagoChicago 1200 OrlandoOrlando 1100 AustinAustin 2000 BostonBoston 980 ChicagoChicago 1150 AustinAustin 1100 OrlandoOrlando 1300 BostonBoston 1300 OrlandoOrlando 1100 AustinAustin 1150 ChicagoChicago 980 BostonBoston 1300 OrlandoOrlando 1200 ChicagoChicago 1150 AustinAustin 2000 BostonBoston 2000 AustinAustin 1100 OrlandoOrlando 1200 ChicagoChicago 980 BostonBoston 2000 AustinAustin 1150 ChicagoChicago 1200 Orlando
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
start enddist
Boston 980 Chicago
Boston 2000 Austin
Boston 1300 Orlando
Chicago 980 Boston
Chicago 1150 Austin
Chicago 1200 Orlando
Austin 2000 Boston
Austin 1150 Chicago
Austin 1100 Orlando
Orlando 1300 Boston
Orlando 1200 Chicago
Orlando 1100 Austin
Chicago
Boston
Austin
Orlando
$limit$graphLookup $sort...
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
5280Boston 980 Chicago Chicago 1200 Orlando Orlando 1100 Austin Austin 2000 Boston
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
4530Boston 1300 Orlando Orlando 1100 Austin Austin 1150 Chicago Chicago 980 Boston
5650Boston 1300 Orlando Orlando 1200 Chicago Chicago 1150 Austin Austin 2000 Boston
5280Boston 2000 Austin Austin 1100 Orlando Orlando 1200 Chicago Chicago 980 Boston
5650Boston 2000 Austin Austin 1150 Chicago Chicago 1200 Orlando Orlando 1300 Boston
start enddist start enddist start enddist start enddist tdist
Chicago
Boston
Austin
Orlando
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
5280Boston 980 Chicago Chicago 1200 Orlando Orlando 1100 Austin Austin 2000 Boston
4530Boston 1300 Orlando Orlando 1100 Austin Austin 1150 Chicago Chicago 980 Boston
5650Boston 1300 Orlando Orlando 1200 Chicago Chicago 1150 Austin Austin 2000 Boston
5280Boston 2000 Austin Austin 1100 Orlando Orlando 1200 Chicago Chicago 980 Boston
5650Boston 2000 Austin Austin 1150 Chicago Chicago 1200 Orlando Orlando 1300 Boston
start enddist start enddist start enddist start enddist tdist
Chicago
Boston
Austin
Orlando
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
start enddist start enddist start enddist start enddist tdist
Chicago
Boston
Austin
Orlando
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
Chicago
Boston
Austin
Orlando
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
Chicago
Boston
Austin
Orlando
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
✈
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
Chicago
Boston
Austin
Orlando
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
$
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
Chicago
Boston
Austin
Orlando
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
$
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
Chicago
Boston
Austin
Orlando
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
$
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
Chicago
Boston
Austin
Orlando
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
$
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
Chicago
Boston
Austin
Orlando
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
$
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
Chicago
Boston
Austin
Orlando
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
✈
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
Chicago
Boston
Austin
Orlando
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
…,{$graphLookup:{from:"dists",startWith:"$end",connectFromField:"end",connectToField:"start",

dpthField:"lvl", as:"routes"}}, …, {$sort:{"tdist":1}}, {$limit:1})]
4530Boston 980 Chicago Chicago 1150 Austin Austin 1100 Orlando Orlando 1300 Boston
Facets
{
MongoDB
MongoDB
_id name dpt sal
MongoDB
_id name dpt sal
MongoDB
_id name dpt sal expertise
MongoDB
_id name dpt sal expertise
5 results for mongodb
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
3 results for oracle
Fred
location: US
salary: 300
expertise: Oracle, Cobol
Gina
location: US
salary: 200
expertise: Oracle, Pascal
Ivan
location: NL
salary: 400
expertise: Oracle, Fortran
Search | EmpView
Location
All
US
NL
✔
Expertise
All
Oracle
Cobol
Pascal
Fortran
✔
Salary
All
100 - 200
200 - 400
✔
oracle
(2)
(1)
(3)
(1)
(1)
(1)
(1)
(2)
https://www.awesomeempview.com/search/f?type=all&key…
MongoDB
_id name dpt sal expertise
MongoDB
_id name dpt sal expertise
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
_id name dpt sal expertise
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
_id name dpt sal expertise
db.emps.aggregate([

{ $match: { $text : { $search : "mongodb" }}},

{ $sortByCount: "$dpt"}

])
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
_id name dpt sal expertise
db.emps.aggregate([

{ $match: { $text : { $search : "mongodb" }}},

{ $sortByCount: "$dpt"}

])
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
{"_id":"DE", "count":3},
{"_id":"NL", "count":1},
{"_id":"US", "count":1}
_id name dpt sal expertise
db.emps.aggregate([

{ $match: { $text : { $search : "mongodb" }}},

{ $sortByCount: "$dpt"}

])
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
db.emps.aggregate( [

{$match: { $text : {$search : "mongodb" }}},

{$unwind: "$expertise"},

{$sortByCount: "$expertise"}

])
_id name dpt sal expertise
{"_id":"MongoDB","count":5},
{"_id":"Java","count":2},
{"_id":"Ruby","count":2},
{"_id":"Scala","count":1}
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
db.emps.aggregate([

{$match: { $text : {$search : "mongodb" }}},

{$bucket: {

groupBy: "$sal",

boundaries: [100, 201, 401, 601, Infinity]}}

])
{"_id":100,"count":2},
{"_id":201,"count":2},
{"_id":401,"count":1}
_id name dpt sal expertise
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
db.emps.aggregate([

{$match: { $text : {$search : "mongodb" }}},

{$bucket: {

groupBy: "$sal",

boundaries: [100, 201, 401, 601, Infinity],

output: {

count: {$sum: 1},

matches: {$push: "$$CURRENT"}

}}}

])
{"_id":100,"count":2,"matches":[
]},
{"_id":201,"count":2,"matches":[
]},
{"_id":401,"count":1,"matches":[
]}
_id name dpt sal expertise
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
db.emps.aggregate([

{$match: { $text : {$search : "mongodb" }}},

{$bucketAuto: {

groupBy: "$sal",

buckets: 4}}

])
{"_id":{"min":100,"max":200},
"count":1},
{"_id":{"min":200,"max":300},
"count":1},
{"_id":{"min":300,"max":400},
“count":1},
{"_id":{"min":400,"max":600},
"count":2}
_id name dpt sal expertise
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
db.emps.aggregate([

{$match: { $text : {$search :

{$facet: {

"Location": [

{$sortByCount: "$dpt"}

],

"Expertise":[

{$unwind: "$expertise"},

{$sortByCount: "$expertise"}

],

"Salary":[

{$bucket: {

groupBy: "$sal",

boundaries: [100, 201, 401, 601, Infinity]}}

]}}])
{"Location":[

{"_id":"DE","count":3},

{"_id":"NL","count":1},

{"_id":"US","count":1}],



"Expertise":[

{"_id":"MongoDB","count":5},

{"_id":"Java","count":2},

{"_id":"Ruby","count":2},

{"_id":"Scala","count":1}],



"Salary":[

{"_id":100,"count":2},

{"_id":201,"count":2},

{"_id":401,"count":1}]}
_id name dpt sal expertise
}}},"mongodb"
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
{"Location":[

{"_id":"DE","count":3},

{"_id":"NL","count":1},

{"_id":"US","count":1}],



"Expertise":[

{"_id":"MongoDB","count":5},

{"_id":"Java","count":2},

{"_id":"Ruby","count":2},

{"_id":"Scala","count":1}],



"Salary":[

{"_id":100,"count":2},

{"_id":201,"count":2},

{"_id":401,"count":1}]}
_id name dpt sal expertise
db.emps.aggregate([

{$match: { $text : {$search :

{$facet: {

"Location": [

{$sortByCount: "$dpt"}

],

"Expertise":[

{$unwind: "$expertise"},

{$sortByCount: "$expertise"}

],

"Salary":[

{$bucket: {

groupBy: "$sal",

boundaries: [100, 201, 401, 601, Infinity]}}

]}}])
}}},"mongodb"
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
{"Location":[

{"_id":"DE","count":3},

{"_id":"NL","count":1},

{"_id":"US","count":1}],



"Expertise":[

{"_id":"MongoDB","count":5},

{"_id":"Java","count":2},

{"_id":"Ruby","count":2},

{"_id":"Scala","count":1}],



"Salary":[

{"_id":100,"count":2},

{"_id":201,"count":2},

{"_id":401,"count":1}]}
_id name dpt sal expertise
db.emps.aggregate([

{$match: { $text : {$search :

{$facet: {

"Location": [

{$sortByCount: "$dpt"}

],

"Expertise":[

{$unwind: "$expertise"},

{$sortByCount: "$expertise"}

],

"Salary":[

{$bucket: {

groupBy: "$sal",

boundaries: [100, 201, 401, 601, Infinity]}}

]}}])
}}},"mongodb"
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
{"Location":[

{"_id":"DE","count":3},

{"_id":"NL","count":1},

{"_id":"US","count":1}],



"Expertise":[

{"_id":"MongoDB","count":5},

{"_id":"Java","count":2},

{"_id":"Ruby","count":2},

{"_id":"Scala","count":1}],



"Salary":[

{"_id":100,"count":2},

{"_id":201,"count":2},

{"_id":401,"count":1}]}
_id name dpt sal expertise
db.emps.aggregate([

{$match: { $text : {$search :

{$facet: {

"Location": [

{$sortByCount: "$dpt"}

],

"Expertise":[

{$unwind: "$expertise"},

{$sortByCount: "$expertise"}

],

"Salary":[

{$bucket: {

groupBy: "$sal",

boundaries: [100, 201, 401, 601, Infinity]}}

]}}])
}}},""mongodb" "ruby""
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Bert
location: DE
salary: 100
expertise: MongoDB, Java
Cora
location: DE
salary: 200
expertise: MongoDB, Java
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Herb
location: NL
salary: 600
expertise: MongoDB, Scala
Location
All
DE
NL
Salary
All
100 - 200
200 - 400
400 - 600
Expertise
All
MongoDB
Java
Scala
✔
(1)
(2)
(1)
(2)
(2)
(1)
✔
3( )
( )5
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
5 results for mongodb
_id name dpt sal expertise
db.emps.aggregate([

{$match: { $text : {$search :

{$facet: {

"Location": [

{$sortByCount: "$dpt"}

],

"Expertise":[

{$unwind: "$expertise"},

{$sortByCount: "$expertise"}

],

"Salary":[

{$bucket: {

groupBy: "$sal",

boundaries: [100, 201, 401, 601, Infinity]}}

]}}])
}}},""mongodb" "ruby""
{"Location":[

{"_id":"DE","count":1},

{"_id":"US","count":1}],



"Expertise":[

{"_id":"MongoDB","count":2},

{"_id":"Ruby","count":2}],



"Salary":[

{"_id":201,"count":2}]}
MongoDB
Alex
location: DE
salary: 300
expertise: MongoDB, Ruby
Erik
location: US
salary: 400
expertise: MongoDB, Ruby
Location
All
DE
Salary
All
200 - 400
Expertise
All
MongoDB
✔
(2)
✔
1(
( )2
Ruby (2)
US (1)
✔
https://www.awesomeempview.com/search/f?type=all&key…
Search | EmpView
mongodb
2 results for mongodb
_id name dpt sal expertise
db.emps.aggregate([

{$match: { $text : {$search :

{$facet: {

"Location": [

{$sortByCount: "$dpt"}

],

"Expertise":[

{$unwind: "$expertise"},

{$sortByCount: "$expertise"}

],

"Salary":[

{$bucket: {

groupBy: "$sal",

boundaries: [100, 201, 401, 601, Infinity]}}

]}}])
}}},""mongodb" "ruby""
{"Location":[

{"_id":"DE","count":1},

{"_id":"US","count":1}],



"Expertise":[

{"_id":"MongoDB","count":2},

{"_id":"Ruby","count":2}],



"Salary":[

{"_id":201,"count":2}]})
MongoDB
MongoDB
One more thing…
PL Land
PL Land
nats =
nats. (nats. {|n| nats. (n-1)
. (1)
. {|p| n % p != 0}
. })
drop
take
map
all?
mapzip
[1,2,3,4,5,6,7,8,9,10]
Ruby
PL Land
[[1, true ],
[2, true ],
[3, true ],
[4, false],
[5, true ],
[6, false],
[7, true ],
[8, false],
[9, false],
[10,false]]
nats =
nats. (nats. {|n| nats. (n-1)
. (1)
. {|p| n % p != 0}
. })
drop
take
map
all?
mapzip
[1,2,3,4,5,6,7,8,9,10]
Ruby
PL Land
drop
take
map
all?
mapzip
[1,2,3,4,5,6,7,8,9,10]
Ruby
PL Land
drop
take
map
all?
mapzip
$range: [1, 11, 1]
Ruby
PL Land
drop
take
map
all?
map$zip
$range: [1, 11, 1]
Ruby
PL Land
drop
take
map
all?
map$zip
$range: [1, 11, 1]
["A", "B", "C"]
[10, 20, 30]
Ruby
PL Land
drop
take
map
all?
map$zip
$range: [1, 11, 1]
["A", "B", "C"]
[10, 20, 30]
[["A",10], ["B",20], ["C",30]]
Ruby
PL Land
drop
take
map
all?
$map$zip
$range: [1, 11, 1]
Ruby
PL Land
drop
map
all?
$slice$map$zip
$range: [1, 11, 1]
Ruby
PL Land
map
all?
$slice
$slice
$map$zip
$range: [1, 11, 1]
Ruby
PL Land
all?
$slice
$slice
$map
$map$zip
$range: [1, 11, 1]
Ruby
PL Land
$slice
$slice
$map
$allElementsTrue
$map$zip
$range: [1, 11, 1]
Ruby
PL Land
$slice
$slice
$map
$allElementsTrue
$map
$zip
$range: [1, 11, 1]
Ruby
$let: {vars: {nats: { }}, in: {

: {inputs: ["$$nats", {

: {input: "$$nats", as: "n", in: {

: [{

: {input: {
: [{
: ["$$nats", {$subtract: ["$$n", 1]}]},
1, {$size: "$$nats"}]}, as: "p", in: {
$ne: [{$mod: ["$$n", "$$p"]}, 0]}}}]}}}]}}}
PL Land
$slice
$slice
$map
$allElementsTrue
$map
$zip
: [1, 11, 1]$range
Aggregation Pipeline
$let: {vars: {nats: { }}, in: {

: {inputs: ["$$nats", {

: {input: "$$nats", as: "n", in: {

: [{

: {input: {
: [{
: ["$$nats", {$subtract: ["$$n", 1]}]},
1, {$size: "$$nats"}]}, as: "p", in: {
$ne: [{$mod: ["$$n", "$$p"]}, 0]}}}]}}}]}}}
PL Land
$slice
$slice
$map
$allElementsTrue
$map
$zip
: [1, 11, 1]$range
Aggregation Pipeline
$allElementsTrue$map$slice$slice
$map
$range $zip
MongoDB
PL Land
$let: {vars: {nats: { }}, in: {

: {inputs: ["$$nats", {

: {input: "$$nats", as: "n", in: {

: [{

: {input: {
: [{
: ["$$nats", {$subtract: ["$$n", 1]}]},
1, {$size: "$$nats"}]}, as: "p", in: {
$ne: [{$mod: ["$$n", "$$p"]}, 0]}}}]}}}]}}}
$slice
$slice
$map
$allElementsTrue
$map
$zip
: [1, 11, 1]$range
Aggregation Pipeline
$allElementsTrue$map$slice$slice
$map
$range $zip
MongoDB
PL Land
[[1, true ],
[2, true ],
[3, true ],
[4, false],
[5, true ],
[6, false],
[7, true ],
[8, false],
[9, false],
[10,false]]
$let: {vars: {nats: { }}, in: {

: {inputs: ["$$nats", {

: {input: "$$nats", as: "n", in: {

: [{

: {input: {
: [{
: ["$$nats", {$subtract: ["$$n", 1]}]},
1, {$size: "$$nats"}]}, as: "p", in: {
$ne: [{$mod: ["$$n", "$$p"]}, 0]}}}]}}}]}}}
$slice
$slice
$map
$allElementsTrue
$map
$zip
: [1, 11, 1]$range
Aggregation Pipeline
$allElementsTrue$map$slice$slice
$map
$range $zip
$slice
$slice
$map
$allElementsTrue
$map
$zip
$range
$slice
$map
$allElementsTrue
$zip
$range
$indexStats
$stdDevSamp
$stdDevPop
$sqrt
$abs
$log
$log10
$ln $pow
$exp
$trunc
$ceil
$floor
$arrayElemAt $concatArrays
$isArray
$filter
$avg
$min
$max
$sum
$stdDevPop
$stdDevSamp
$split
$indexOf
$reduce
$reverseArray
$indexOfArray
$type
$isoWeekYear
$isoDayOfWeek
$isoWeek
$in
$switch
$count
$replaceRoot
$addFields
$graphLookup $facet
$bucket $bucketAuto $sortByCount
$out
$redact
$setEquals
$setIntersection$setUnion
$setDifference
$setIsSubset $anyElementTrue
$literal
$size
$geoNear $millisecond $concat
$project $match $limit
$skip
$unwind
$group $sort
$and $or
$not
$cmp
$eq $gt
$gte
$lt
$lte
$ne
$abs
$add
$ceil
$divide
$mod
$multiply
$subtract
$toLower
$toUpper
$strcasecmp
$meta
$let
$dayOfYear
$dayOfMonth
$dayOfWeek
$year
$month
$week
$hour
$minute
$second
$millisecond
$dateToString
$cond
$ifNull
$first
$last
$push
$addToSet
$indexOfBytes
$indexOfCP
$strLenBytes
$strLenCP
$substrBytes
$substrCP
$slice
$map
$allElementsTrue
$zip
$range
$sample$lookup
$dateToString
$collStats
3.0
3.4
3.2
2.6
2.4
2.2
$indexStats
$stdDevSamp
$stdDevPop
$sqrt
$abs
$log
$log10
$ln $pow
$exp
$trunc
$ceil
$floor
$arrayElemAt $concatArrays
$isArray
$filter
$avg
$min
$max
$sum
$stdDevPop
$stdDevSamp
$out
$redact
$setEquals
$setIntersection$setUnion
$setDifference
$setIsSubset $anyElementTrue
$literal
$size
$geoNear $millisecond $concat
$project $match $limit
$skip
$unwind
$group $sort
$and $or
$not
$cmp
$eq $gt
$gte
$lt
$lte
$ne
$abs
$add
$ceil
$divide
$mod
$multiply
$subtract
$toLower
$toUpper
$strcasecmp
$meta
$let
$dayOfYear
$dayOfMonth
$dayOfWeek
$year
$month
$week
$hour
$minute
$second
$millisecond
$dateToString
$cond
$ifNull
$first
$last
$push
$addToSet
$slice
$map
$allElementsTrue
$sample$lookup
$dateToString
$split
$indexOf
$reduce
$reverseArray
$indexOfArray
$type
$isoWeekYear
$isoDayOfWeek
$isoWeek
$in
$switch
$count
$replaceRoot
$addFields
$graphLookup $facet
$bucket $bucketAuto $sortByCount
$indexOfBytes
$indexOfCP
$strLenBytes
$strLenCP
$substrBytes
$substrCP
$zip
$range
$collStats
2.4 $geoNear $millisecond $concat
2.2
$avg
$min
$max
$sum
$stdDevPop
$stdDevSamp
$project $match $limit
$skip
$unwind
$group $sort
$and $or
$not
$cmp
$eq $gt
$gte
$lt
$lte
$ne
$abs
$add
$ceil
$divide
$mod
$multiply
$subtract
$toLower
$toUpper
$strcasecmp
$meta
$let
$dayOfYear
$dayOfMonth
$dayOfWeek
$year
$month
$week
$hour
$minute
$second
$millisecond
$dateToString
$cond
$ifNull
$first
$last
$push
$addToSet
$map
2.6
$out
$redact
$setEquals
$setIntersection$setUnion
$setDifference
$setIsSubset $anyElementTrue
$literal
$size
$allElementsTrue
3.2$indexStats
$stdDevSamp
$stdDevPop
$sqrt
$abs
$log
$log10
$ln $pow
$exp
$trunc
$ceil
$floor
$arrayElemAt $concatArrays
$isArray
$filter
$slice
$sample$lookup
3.0$dateToString
3.4
$indexOf $indexOfArray
$type
$isoWeekYear
$in
$switch
$count
$replaceRoot
$addFields
$graphLookup $facet
$bucket $bucketAuto $sortByCount
$indexOfBytes
$indexOfCP$substrBytes
$substrCP
$zip
$range
$split
$reduce
$reverseArray $isoWeekYear
$isoDayOfWeek
$isoWeek
$strLenBytes
$strLenCP $collStats
Data-Parallel 

Pipeline Execution
Shard 1 Shard 2 Shard 3 Shard N
mongos
Q
Pipeline

Optimisations
Pipeline Projection Optimization
Pipeline Coalescence Optimization
. . .
Pipeline Reordering
Pipeline Combining
2.4 $geoNear $millisecond $concat
2.2
$avg
$min
$max
$sum
$stdDevPop
$stdDevSamp
$project $match $limit
$skip
$unwind
$group $sort
$and $or
$not
$cmp
$eq $gt
$gte
$lt
$lte
$ne
$abs
$add
$ceil
$divide
$mod
$multiply
$subtract
$toLower
$toUpper
$strcasecmp
$meta
$let
$dayOfYear
$dayOfMonth
$dayOfWeek
$year
$month
$week
$hour
$minute
$second
$millisecond
$dateToString
$cond
$ifNull
$first
$last
$push
$addToSet
$map
2.6
$out
$redact
$setEquals
$setIntersection$setUnion
$setDifference
$setIsSubset $anyElementTrue
$literal
$size
$allElementsTrue
3.2$indexStats
$stdDevSamp
$stdDevPop
$sqrt
$abs
$log
$log10
$ln $pow
$exp
$trunc
$ceil
$floor
$arrayElemAt $concatArrays
$isArray
$filter
$slice
$sample$lookup
3.0$dateToString
3.4
$indexOf $indexOfArray
$type
$isoWeekYear
$in
$switch
$count
$replaceRoot
$addFields
$graphLookup $facet
$bucket $bucketAuto $sortByCount
$indexOfBytes
$indexOfCP$substrBytes
$substrCP
$zip
$range
$split
$reduce
$reverseArray $isoWeekYear
$isoDayOfWeek
$isoWeek
$strLenBytes
$strLenCP $collStats
Aggregation Pipelines
(1) are one of the easiest ways to work with your data.
(2) are highly scalable and optimised for performance.
(3) are (much) more capable and powerful than you think!
Use the Force Aggregation Pipelines!
And take control over your Data.
ASK THE EXPERTS
Get your technical questions answered
By appointment only – register in one of two ways:
In person Online
Come to the MongoDB Team
Stand on the ground floor
calendly.com/mongodb

Advanced MongoDB Aggregation Pipelines

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