We will do a deep dive into the powerful query capabilities of MongoDB's Aggregation Framework, and show you how you can use MongoDB's built-in features to inspect the execution and tune the performance of your queries. And, last but not least, we will also give you a brief outlook into MongoDB 3.4's awesome new Aggregation Framework additions.
5. "Data should be easy to work with."
"The data should serve you.
You should not serve the data."
"The same (data-) model in your head, in your code, and in your data
- NO impedance mismatch."
Eliot Horowitz
CTO & Co-Founder of MongoDB
MongoDB World’16
6. MongoDB Aggregation Framework
"Data should be easy to work with."
"The data should serve you.
You should not serve the data."
"The same (data-) model in your head, in your code, and in your data
- NO impedance mismatch."
7. A Highly Composable Compute Pipeline
MongoDB Aggregation Framework
$sum$match
10. A Highly Composable Compute Pipeline
3
4
3
13
6
4
6
3
6
4
MongoDB Aggregation Framework
$sum$match
Notions of computation and monads
Eugenio Moggi∗
Abstract
The λ-calculus is considered an useful mathematical tool in the study of programming
languages, since programs can be identified with λ-terms. However, if one goes further and
uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced
(programs are identified with total functions from values to values), that may jeopardise the
applicability of theoretical results. In this paper we introduce calculi based on a categorical
semantics for computations, that provide a correct basis for proving equivalence of programs,
for a wide range of notions of computation.
11. A Highly Composable Compute Pipeline
3
4
3
13
6
4
6
3
6
4
MongoDB Aggregation Framework
$sum$match
Notions of computation and monads
Eugenio Moggi∗
Abstract
The λ-calculus is considered an useful mathematical tool in the study of programming
languages, since programs can be identified with λ-terms. However, if one goes further and
uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced
(programs are identified with total functions from values to values), that may jeopardise the
applicability of theoretical results. In this paper we introduce calculi based on a categorical
semantics for computations, that provide a correct basis for proving equivalence of programs,
for a wide range of notions of computation.
A monad defines what it means to chain operations together.
This allows the programmer to build pipelines that process data in a
series of steps […]
Monads allow a programming style where programs are written by
putting together highly composable parts […]
12. A Highly Composable Compute Pipeline
3
4
3
13
6
4
6
3
6
4
MongoDB Aggregation Framework
$sum$match
Notions of computation and monads
Eugenio Moggi∗
Abstract
The λ-calculus is considered an useful mathematical tool in the study of programming
languages, since programs can be identified with λ-terms. However, if one goes further and
uses βη-conversion to prove equivalence of programs, then a gross simplification is introduced
(programs are identified with total functions from values to values), that may jeopardise the
applicability of theoretical results. In this paper we introduce calculi based on a categorical
semantics for computations, that provide a correct basis for proving equivalence of programs,
for a wide range of notions of computation.
A monad defines what it means to chain operations together.
This allows the programmer to build pipelines that process data in a
series of steps […]
Monads allow a programming style where programs are written by
putting together highly composable parts […]
Ruby
Module Enumerable:
collect, select, group_by, …
C# / LINQ
IEnumerable<T>:
Select, Where, GroupBy, …
Java
Stream<T>:
collect,filter,groupingBy,…
MongoDB
Aggregation Framework:
$project, $match, $group, …
map, filter, group, …
Haskell
Module Data.List:
14. Aggregation Pipelines
(1) are one of the easiest ways to work with your data.
(2) are highly scalable and optimised for performance.
(3) are (much) more capable and powerful than you think!
3
4
3
13
6
4
6
3
6
4
$sum$match
15. Aggregation Pipelines
(1) are one of the easiest ways to work with your data.
(2) are highly scalable and optimised for performance.
(3) are (much) more capable and powerful than you think!
16. 1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
The two top paid employees
per departement
1 Alex DE 300
3 Cora DE 200
DE
US
5 Erik US 400
6 Fred US 300
NL
8 Herb NL 600
9 Ivan NL 400
UK
10 Jill UK 500
DB Land
17. 1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
The two top paid employees
per departement
1 Alex DE 300
3 Cora DE 200
DE
US
5 Erik US 400
6 Fred US 300
NL
8 Herb NL 600
9 Ivan NL 400
UK
10 Jill UK 500
DB Land
18. 1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
The two top paid employees
per departement
select id, name, dpt, sal
from emps
where sal =
(select max(sal)
from emps as e
where e.dpt = emps.dpt)
or sal =
(select max(sal)
from emps as e
where e.dpt = emps.dpt
and sal <
(select max(sal)
from emps as e2
where e2.dpt = emps.dpt));
DB Land
19. 1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
The two top paid employees
per departement
select r.id, r.name, r.dpt, r.sal
from (select id, name, dept, sal,
rank()
OVER (PARTITION BY dpt
ORDER BY sal DESC)
as rank
from emps) AS r
where r.rank <= 2
order by r.dpt, r.rank
1 Alex DE 300
3 Cora DE 200
5 Erik US 400
6 Fred US 300
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
DB Land
20. 1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
The two top paid employees
per departement
1 Alex DE 300
3 Cora DE 200
5 Erik US 400
6 Fred US 300
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
1 Alex DE 300
3 Cora DE 200
DE
US
5 Erik US 400
6 Fred US 300
NL
8 Herb NL 600
9 Ivan NL 400
UK
10 Jill UK 500
?
DB Land
21. 1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
The two top paid employees
per departement
1 Alex DE 300
3 Cora DE 200
5 Erik US 400
6 Fred US 300
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
1 Alex DE 300
3 Cora DE 200
DE
US
5 Erik US 400
6 Fred US 300
NL
8 Herb NL 600
9 Ivan NL 400
UK
10 Jill UK 500
?
"Data should be easy to work with."
"The data should serve you.
You should not serve the data."
"The same (data-) model in your head, in your code, and in your data
- NO impedance mismatch."
DB Land
22. 1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
DB LandPL Land
23. PL Land
1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
ID NAME DPT SAL
DB Land
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
45. Aggregation Pipelines
(1) are one of the easiest ways to work with your data.
(2) are highly scalable and optimised for performance.
(3) are (much) more capable and powerful than you think!
46. Benchmarking
PL Land vs DB Land
2,2 GHz Intel Core i7 CPU
16 GB 1600 MHz DDR3 RAM
SSD-Storage
MongoDB Enterprise 3.4.0-rc0
WiredTiger (12 GB Cache Size,
snappy compressor)
!
50. PL Land DB Land
Q
# Employees Data Size Index Size Runtime Runtime
1M 50 MB 20 MB 6 s + 7 s 100 ms
10M 500 MB 200 MB 133 s + 99 s 1 s
100M 5 GB 2 GB 2 h - OOM 5 m
51. PL Land DB Land
Q
100M 5 GB 2 GB 2 h - OOM 5 m
52. DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
]
$slice
)
$project
$group
$sort
$project
$group
$sort
5 GB
53. DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
]
$slice
)
$project
$group
$sort
$project
$group
$sort
5 GB"errmsg":"Exceeded memory limit for $group,
but didn't allow external sort.
Pass allowDiskUse:true to opt in."
54. DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
]
$slice
)
$project
$group
$sort
$project
$group
$sort
5 GB
,{allowDiskUse:true}
55. DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
db.emps.aggregate([
{ : {dpt:1, sal:-1}},
{ : {_id:"$dpt", emps:{$push: "$$CURRENT"}}},
{ : {dpt:"$_id", emps:{ : ["$emps",2]}}}
]
$slice
)
$project
$group
$sort
$project
$group
$sort
5 GB
,{allowDiskUse:true}
!
CPU Load
56. DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
$project
$group
$sort
5 GB
mongod --dbpath ~/data/shard1 --port 40001
mongod --dbpath ~/data/shard2 --port 40002
…
mongod --dbpath ~/data/shard10 --port 40010
!
57. DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
$project
$group
$sort
5 GB
mongod --dbpath ~/data/shard1 --port 40001
mongod --dbpath ~/data/shard2 --port 40002
…
mongod --dbpath ~/data/shard10 --port 40010
!
58. DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
$project
$group
$sort
5 GB
mongod --dbpath ~/data/shard1 --port 40001
mongod --dbpath ~/data/shard2 --port 40002
…
mongod --dbpath ~/data/shard10 --port 40010
!
sh.addShard("Toms-MacBook-Pro.local:40001")
sh.addShard("Toms-MacBook-Pro.local:40002")
…
sh.addShard("Toms-MacBook-Pro.local:40010")
59. DB Land
100M 5 GB 2 GB 2 h - OOM 5 m
$project
$group
$sort
5 GB
mongod --dbpath ~/data/shard1 --port 40001
mongod --dbpath ~/data/shard2 --port 40002
…
mongod --dbpath ~/data/shard10 --port 40010
!
sh.addShard("Toms-MacBook-Pro.local:40001")
sh.addShard("Toms-MacBook-Pro.local:40002")
…
sh.addShard("Toms-MacBook-Pro.local:40010")
sh.shardCollection("DB.emps", {dpt:1})
81. "multiKeyPaths": {
"dpt": [],
"sal": [],
"name": []
},
"isUnique": false,
"isSparse": false,
"isPartial": false,
"indexVersion": 2,
"direction": "forward",
"indexBounds": {
"dpt": [
"["DE", "DE"]"
],
"sal": [
"[MaxKey, MinKey]"
],
"name": [
"[MinKey, MaxKey]"
]
}
}
},
db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
IXSCAN
Index on
"dpt":1,
"sal":-1,
"name":1
PROJECTION
Index used
for sorting
82. "multiKeyPaths": {
"dpt": [],
"sal": [],
"name": []
},
"isUnique": false,
"isSparse": false,
"isPartial": false,
"indexVersion": 2,
"direction": "forward",
"indexBounds": {
"dpt": [
"["DE", "DE"]"
],
"sal": [
"[MaxKey, MinKey]"
],
"name": [
"[MinKey, MaxKey]"
]
}
}
},
db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
IXSCAN
Index on
"dpt":1,
"sal":-1,
"name":1
PROJECTION
Index used
for sorting
Pipeline
Reordering:
Index used
for matching
83. "queryPlanner": {
"plannerVersion": 1,
"namespace": "DB.emps",
"indexFilterSet": false,
"parsedQuery": {
"dpt": {
"$eq": "DE"
}
},
"winningPlan": {
"stage": "PROJECTION",
"transformBy": {
"dpt": 1,
"name": 1,
"sal": 1,
"_id": 0
},
"inputStage": {
"stage": "IXSCAN",
"keyPattern": {
"dpt": 1,
"sal": -1,
"name": 1
db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
IXSCAN
Index on
"dpt":1,
"sal":-1,
"name":1
PROJECTION
Index used
for sorting
Pipeline
Reordering:
Index used
for matching
84. "queryPlanner": {
"plannerVersion": 1,
"namespace": "DB.emps",
"indexFilterSet": false,
"parsedQuery": {
"dpt": {
"$eq": "DE"
}
},
"winningPlan": {
"stage": "PROJECTION",
"transformBy": {
"dpt": 1,
"name": 1,
"sal": 1,
"_id": 0
},
"inputStage": {
"stage": "IXSCAN",
"keyPattern": {
"dpt": 1,
"sal": -1,
"name": 1
db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
IXSCAN
Index on
"dpt":1,
"sal":-1,
"name":1
PROJECTION
Index used
for sorting
Pipeline
Reordering:
Index used
for matching
Projection
Optimization:
Query turned to
Covered Query
85. "queryPlanner": {
"plannerVersion": 1,
"namespace": "DB.emps",
"indexFilterSet": false,
"parsedQuery": {
"dpt": {
"$eq": "DE"
}
},
"winningPlan": {
"stage": "PROJECTION",
"transformBy": {
"dpt": 1,
"name": 1,
"sal": 1,
"_id": 0
},
"inputStage": {
"stage": "IXSCAN",
"keyPattern": {
"dpt": 1,
"sal": -1,
"name": 1
db.emps.aggregate([
]
{$sort: {dpt:1,sal:-1}},
{$group: {_id:"$dpt",emps:{$push:{name:"$name",sal:"$sal"}}}},
{$project: {dpt:"$_id",emps:{$slice :["$emps",2]}}}
{$match: {dpt:"DE"}},
,{explain:true})
DB Land
$group
$project
$cursor
IXSCAN
Index on
"dpt":1,
"sal":-1,
"name":1
PROJECTION
Index used
for sorting
Pipeline
Reordering:
Index used
for matching
Projection
Optimization:
Query turned to
Covered Query
86. DB Land
Aggregation Pipelines
(1) are one of the easiest ways to work with your data.
(2) are highly scalable and optimised for performance.
(3) are (much) more capable and powerful than you think!
87. 1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
DB Land
_id name dpt sal
88. 1 Alex DE 300
2 Bert DE 100
3 Cora DE 200
4 Drew US 200
5 Erik US 400
6 Fred US 300
7 Gina US 200
8 Herb NL 600
9 Ivan NL 400
10 Jill UK 500
DB Land
_id name dpt sal
10
3
1
6
10
5
5
10
8
bid
89. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
90. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
$match $graphLookup
91. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
92. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]
3 Cora DE 200 1
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
93. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]
3 Cora DE 200 1
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
94. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]
3 Cora DE 200 1
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
95. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]
3 Cora DE 200 1
_id name dpt sal bid
"
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
96. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
97. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
98. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{ }2 Bert DE 100 3
_id name dpt sal bid
"bosses":[, ]3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
99. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{
}
2 Bert DE 100 3
_id name dpt sal bid
"bosses":[,
]
3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"lvl":1,{ }
,
db.emps.aggregate([
])
Bert’s bosses
{$match: {name:"Bert"}},
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
100. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{
}
2 Bert DE 100 3
_id name dpt sal bid
"bosses":[,
]
3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"lvl":1,{ }
,
10 Jill UK 500
_id name dpt sal bid
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
101. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{
}
2 Bert DE 100 3
_id name dpt sal bid
"bosses":[,
]
3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"lvl":1,{ }
,
10 Jill UK 500
_id name dpt sal bid
"
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
102. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{
}
2 Bert DE 100 3
_id name dpt sal bid
"bosses":[,
]
3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"lvl":1,{ }
,
10 Jill UK 500
_id name dpt sal bid
"lvl":2,{ }
,
{$match: {name:"Bert"}},
db.emps.aggregate([
])
Bert’s bosses
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
103. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
Bert’s bosses
{
}
2 Bert DE 100 3
_id name dpt sal bid
"bosses":[,
]
3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"lvl":1,{ }
,
10 Jill UK 500
_id name dpt sal bid
"lvl":2,{ }
,
{$match: {name:"Bert"}},
db.emps.aggregate([
])
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
104. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
Bert’s bosses
{
}
2 Bert DE 100 3
_id name dpt sal bid
"bosses":[,
]
3 Cora DE 200 1
_id name dpt sal bid
"lvl":0,{ }
1 Alex DE 300 10
_id name dpt sal bid
"lvl":1,{ }
,
10 Jill UK 500
_id name dpt sal bid
"lvl":2,{ }
,
{$match: {name:"Bert"}},
db.emps.aggregate([
])
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
105. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
Bert’s bosses
{$match: {name:"Bert"}},
db.emps.aggregate([
])
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
106. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
The two employees bosseswith most
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
])
db.emps.aggregate([
,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
$limit$graphLookup $sort
107. 8 Herb NL 600 10
10 Jill UK 500
5 Erik US 400 105 Erik US 400 10
10 Jill UK 500
6 Fred US 300 5
1 Alex DE 300 10
3 Cora DE 200 1
10 Jill UK 50010 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[]}]
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
108. 8 Herb NL 600 10
10 Jill UK 500
5 Erik US 400 105 Erik US 400 10
10 Jill UK 500
6 Fred US 300 5
1 Alex DE 300 10
3 Cora DE 200 1
10 Jill UK 50010 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[]}]
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
109. 8 Herb NL 600 10
10 Jill UK 500
5 Erik US 400 105 Erik US 400 10
10 Jill UK 500
6 Fred US 300 5
1 Alex DE 300 10
3 Cora DE 200 1
10 Jill UK 50010 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[
{ ,"bosses":[]}]
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
110. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}[
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[]}]
3 Cora DE 200 1
1 Alex DE 300 10
6 Fred US 300 5
10 Jill UK 500
5 Erik US 400 10
5 Erik US 400 10
10 Jill UK 500
8 Herb NL 600 10
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
111. 10 Jill UK 50010 Jill UK 50010 Jill UK 500
5 Erik US 400 10
10 Jill UK 500
1 Alex DE 300 10
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}[
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[{ ,"lvl":0}
{ ,"bosses":[]}]
3 Cora DE 200 1
1 Alex DE 300 10
6 Fred US 300 5
10 Jill UK 500
5 Erik US 400 10
5 Erik US 400 10
10 Jill UK 500
8 Herb NL 600 10
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
112. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}[
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[]}]
3 Cora DE 200 1 1 Alex DE 300 10
1 Alex DE 300 10 10 Jill UK 500
6 Fred US 300 5 5 Erik US 400 10
10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
10 Jill UK 500
8 Herb NL 600 10 10 Jill UK 500
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
113. 10 Jill UK 50010 Jill UK 50010 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}[
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[]}]
3 Cora DE 200 1 1 Alex DE 300 10
1 Alex DE 300 10 10 Jill UK 500
6 Fred US 300 5 5 Erik US 400 10
10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
10 Jill UK 500
8 Herb NL 600 10 10 Jill UK 500
]},
]},
]},
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
114. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0} }] ,[
{ ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[]}]
3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500
1 Alex DE 300 10 10 Jill UK 500
6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500
10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
10 Jill UK 500
8 Herb NL 600 10 10 Jill UK 500
}] ,
}] ,}] ,
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
115. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
1 Alex DE 300 10
2 Bert DE 100 3
3 Cora DE 200 1
4 Drew US 200 6
5 Erik US 400 10
6 Fred US 300 5
7 Gina US 200 5
8 Herb NL 600 10
9 Ivan NL 400 8
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0} }] ,[
{ ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,
10 Jill UK 500
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[{ ,"lvl":0}
{ ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},
{ ,"bosses":[]}]
3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500
1 Alex DE 300 10 10 Jill UK 500
6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500
10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
5 Erik US 400 10 10 Jill UK 500
10 Jill UK 500
8 Herb NL 600 10 10 Jill UK 500
}] ,
}] ,}] ,
]},
]},
]},
]},
]},
]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
116. 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
[
1 Alex DE 300 10{ ,"bosses":[{ ,"lvl":0} }] ,10 Jill UK 500
10 Jill UK 500{ ,"bosses":[]}]
5 Erik US 400 10{ ,"bosses":[{ ,"lvl":0}10 Jill UK 500 }] ,
8 Herb NL 600 10{ ,"bosses":[{ ,"lvl":0}10 Jill UK 500 }] ,}] ,
2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]},
4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]},
6 Fred US 300 5 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},5 Erik US 400 10 10 Jill UK 500 ]},
7 Gina US 200 5 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},5 Erik US 400 10 10 Jill UK 500 ]},
3 Cora DE 200 1 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},1 Alex DE 300 10 10 Jill UK 500 ]},
9 Ivan NL 400 8 { ,"lvl":1}{ ,"bosses":[{ ,"lvl":0},8 Herb NL 600 10 10 Jill UK 500 ]},
The two employees bosseswith most
])
db.emps.aggregate([
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses" ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
117. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
"bid" "_id""$bid"
"bosses"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
[ 2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]},
4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]}]
The two employees bosseswith most
])
db.emps.aggregate([
,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
118. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}} ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
[ 2 Bert DE 100 3 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,3 Cora DE 200 1 1 Alex DE 300 10 10 Jill UK 500 ]},
4 Drew US 200 6 { ,"lvl":1} { ,"lvl":2}{ ,"bosses":[{ ,"lvl":0}, ,6 Fred US 300 5 5 Erik US 400 10 10 Jill UK 500 ]}]
The two employees bosseswith most
"bid" "_id""$bid"
"bosses"
119. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}} ,
{$sort:{"bosses.leve:-1}}, {$limit:2}"bosses.lvl"
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employees bosseswith most
"bid" "_id""$bid"
"bosses"
120. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}} ,
{$sort:{"bosses.leve:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
"bid" "_id""$bid"
"bosses"
The two employeesbosses with most
"bosses.lvl"
121. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}} ,
{$sort:{"bosses.leve:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
"bid""_id""$bid"
"bosses"
The two employeesbosses with most
"bosses.lvl"
122. ,
{$sort:{"bosses.leve:-1}}, {$limit:2}
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"emps"
"bosses.lvl"
"$_id" "_id" "bid"
123. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses.leve:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"bosses.lvl"
"$_id" "_id" "bid"
"emps" ,
124. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses.leve:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
125. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses.leve:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
126. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
127. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
$limit$graphLookup $sort$addFields
128. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
129. {$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
130. [{ ,"emps":[],
"hdcnt":0}]
9 Ivan NL 400 8
[{ ,"emps":[],
"hdcnt":0}
7 Gina US 200 5
[{ ,"emps":[],
"hdcnt":0}
4 Drew US 200 6
[{ ,"emps":[],
"hdcnt":0}
2 Bert DE 100 3
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
8 Herb NL 600 10 9 Ivan NL 400 8
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
6 Fred US 300 5 4 Drew US 200 6
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
131. [ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ],
"hdcnt":3}
[{ ,"emps":[],
"hdcnt":0}
7 Gina US 200 5
[{ ,"emps":[],
"hdcnt":0}
4 Drew US 200 6
[{ ,"emps":[],
"hdcnt":0}
2 Bert DE 100 3
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
3 Cora DE 200 1 2 Bert DE 100 3
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
8 Herb NL 600 10 9 Ivan NL 400 8
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
6 Fred US 300 5 4 Drew US 200 6
[ { ,"lvl":1}],{ ,"emps":[{ ,"lvl":0},
"hdcnt":2},
1 Alex DE 300 10 3 Cora DE 200 1 2 Bert DE 100 3
, 10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},
132. [ 10 Jill UK 500{ ,"emps":[ { ,"lvl":0} { ,"lvl":0}{ ,"lvl":0}, , ,
{ ,"lvl":1} { ,"lvl":1}{ ,"lvl":1}, , ,
{ ,"lvl":2} { ,"lvl":2}{ ,"lvl":1}, , 4 Drew US 200 6 ],2 Bert DE 100 3
1 Alex DE 300 10 5 Erik US 400 10 8 Herb NL 600 10
3 Cora DE 200 1 7 Gina US 200 5 6 Fred US 300 5
9 Ivan NL 400 8
"hdcnt":9},
[ 5 Erik US 400 10 { ,"lvl":0} { ,"lvl":1}{ ,"emps":[{ ,"lvl":0}, ,7 Gina US 200 5 6 Fred US 300 5 4 Drew US 200 6 ],
"hdcnt":3}
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
3 Cora DE 200 1 2 Bert DE 100 3
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
8 Herb NL 600 10 9 Ivan NL 400 8
[{ ,"emps":[{ ,"lvl":0}],
"hdcnt":1},
6 Fred US 300 5 4 Drew US 200 6
[ { ,"lvl":1}],{ ,"emps":[{ ,"lvl":0},
"hdcnt":2},
1 Alex DE 300 10 3 Cora DE 200 1 2 Bert DE 100 3
,
10 Jill UK 500
_id name dpt sal bid
5 Erik US 400 10
_id name dpt sal bid
7 Gina US 200 5
_id name dpt sal bid
6 Fred US 300 5
_id name dpt sal bid
9 Ivan NL 400 8
_id name dpt sal bid
8 Herb NL 600 10
_id name dpt sal bid
1 Alex DE 300 10
_id name dpt sal bid
3 Cora DE 200 1
_id name dpt sal bid
2 Bert DE 100 3
_id name dpt sal bid
4 Drew US 200 6
_id name dpt sal bid
{$graphLookup: {from:"emps", startWith:"$bid", connectFromField:"bid", connectToField:"_id",
dpthField:"lvl", as:"bosses"}}
,
{$sort:{"bosses:-1}}, {$limit:2}
db.emps.aggregate([
])
The two employeesbosses with most
"$_id" "_id" "bid"
"emps" ,
"hdcnt"
{$addFields: {hdcnt:{$size:"$emps"}}},