SlideShare a Scribd company logo
#MDBW17
DECIPHERING EXPLAIN OUTPUT
Charlie Swanson
Understand how
MongoDB answers
queries
KNOWLEDGE
Figure out what's
going on
DEBUGGING
Learn some tricks to
optimize your queries &
aggregations
BEST PRACTICES
GOALS OF THIS TALK
#MDBW17
CHARLIE
SWANSON
SOFTWARE ENGINEER - QUERY TEAM
#MDBW17
OVERVIEW
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
TARGET QUESTIONS
• Is your query using an index? Which one? 🤔
#MDBW17
TARGET QUESTIONS
• Is your query using an index? Which one?
• Is your query using an index to provide the sort?
🤔
#MDBW17
TARGET QUESTIONS
• Is your query using an index? Which one?
• Is your query using an index to provide the sort?
• How many of the examined documents ended up matching?
🤔
#MDBW17
TARGET QUESTIONS
• Is your query using an index? Which one?
• Is your query using an index to provide the sort?
• How many of the examined documents ended up matching?
• Why did the server choose to answer the query the way it did?
🤔
#MDBW17
TARGET QUESTIONS
• Is your query using an index? Which one?
• Is your query using an index to provide the sort?
• How many of the examined documents ended up matching?
• Why was your winning plan chosen?
• Can my queries go faster?
🤔
#MDBW17
EXAMPLE QUERY
#MDBW17
HOW CAN THE SERVER ANSWER THIS QUERY?
#MDBW17
TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
✅
✅
OPTION 1: COLLECTION SCAN
#MDBW17
COLLECTION SCAN: TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
✅
✅
204587
190587
SORT
01.
02.
#MDBW17
COLLECTION SCAN: TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
✅
✅
01.
02.
SORT
PROJECTION
02
01
{nFavorites: 204587,
username: '@TaylorSwift'}
{nFavorites: 109587,
username: '@Charlie'}
#MDBW17
01.
02.
SORT
PROJECTION
COLLECTION SCAN
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
✅
✅
#MDBW17
OPTION 1: COLLECTION SCAN
SORT
PROJECT
COLLECTION SCAN
#MDBW17
OPTION 2: INDEX SCAN TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
INDEX:
{nFavorites: -1}
204587
190587
87983
83092
76032
29023
…
#MDBW17
TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
INDEX:
{nFavorites: -1}
204587
190587
87983
83092
76032
29023
…
Stop
when
entry is
smaller
than
100,000
#MDBW17
TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
INDEX:
{nFavorites: -1}
204587
190587
87983
83092
76032
29023
…
SORTED!
#MDBW17
TWITTER.TWEETS
INDEX
204587
190587
87983
83092
123
123
…
INDEX SCAN
SORT
#MDBW17
TWITTER.TWEETS
INDEX
204587
190587
87983
83092
123
123
…
INDEX SCAN
FETCH
204587
190587
{ _id: 400000,
createdAt: ISODate(…),
username: "@TaylorSwift", …
{ _id: 400001,
createdAt: ISODate(…),
username: "@Charlie", … }
#MDBW17
TWITTER.TWEETS
INDEX
204587
190587
87983
83092
123
123
…
INDEX SCAN
FETCH
204
190
{ _id: 400000,
{ _id: 400001,
PROJECTION
{nFavorites: 204587,
username: '@TaylorSwift'}
{nFavorites: 109587,
username: '@Charlie'}
{ _id: 400000,
createdAt: ISODate(…),
{ _id: 400001,
createdAt: ISODate(…),
username: "@Charlie", }
#MDBW17
FETCH
204
190
{ _id: 400000,
{ _id: 400001,
PROJECTION
INDEX
204587
190587
87983
83092
123
123
…
INDEX SCAN
#MDBW17
OPTION 2: INDEX SCAN
FETCH
PROJECT
INDEX SCAN
#MDBW17
MANY WAYS TO ANSWER A QUERY… WHICH WAS IT?
SORT
PROJECT
COLLECTION
FETCH
PROJECT
INDEX SCAN
…
#MDBW17
WHAT IS EXPLAIN?
1. Command to explain execution of various other commands
2. Helper on shell cursor object
WHAT IS EXPLAIN? - COMMAND
WHAT IS EXPLAIN? - SHELL HELPER
WHAT IS EXPLAIN? - SHELL HELPER
???
#MDBW17
QUERY PLANS
SORT
PROJECT
COLLECTION
FETCH
PROJECT
INDEX SCAN
…OR
FETCH
INDEX SCAN INDEX SCAN
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
EXPLAIN OUTPUT
> db.collection.find(…).explain("queryPlanner")
{
"queryPlanner" : {
…
"winningPlan" : {…},
"rejectedPlans" : […]
},
…
}
Optional, this is the
default
#MDBW17
EXPLAIN OUTPUT
> db.collection.find(…).explain()
{queryPlanner: {
winningPlan: {
stage: "SORT",
inputStage: {
stage: "FETCH",
inputStage: {
stage: "IXSCAN"
}
}
}
}
}}
FETCH
INDEX SCAN
{nFavorites: -1}
SORT
#MDBW17
EXPLAIN OUTPUT
> db.collection.find(…).explain()
{
…
stage: "IXSCAN"
keyPattern: {nFavorites: -1},
indexBounds: {
a: [ "[inf.0, 100000]" ]

},
… // Other index scan
// specific stats.
…
}}
FETCH
INDEX SCAN
keyPattern: {
nFavorites: -1
}
indexBounds: […]
…
SORT
#MDBW17
EXPLAIN OUTPUT
> db.collection.find(…).explain()
{
"queryPlanner" : {
…
"winningPlan" : {
// Encodes selected plan.
},
"rejectedPlans" : […]
},
…
}
FETCH
INDEX SCAN
SORT
#MDBW17
> db.collection.find(…).explain()
{"queryPlanner" : {
"winningPlan" : {
{"stage" : "SORT",
"inputStage" : {…}
}}
},
"rejectedPlans" : [
{"stage" : "SORT",
"inputStage" : {…}
}}
…
]
}}
EXPLAIN OUTPUT
FETCH
INDEX SCAN
SORT
COLL_SCAN
SORT
APPLYING THIS INFORMATION
#MDBW17
IS YOUR QUERY USING THE INDEX YOU EXPECT?
#MDBW17
IS YOUR QUERY USING THE INDEX YOU EXPECT?
FETCH
SORT
✓ COLLECTION SCAN
SORT
✗
INDEX SCAN
keyPattern: {nFollowers: -1}
#MDBW17
IS YOUR QUERY USING THE INDEX YOU EXPECT?
#MDBW17
IS YOUR QUERY USING THE INDEX YOU EXPECT?
db.tweets.explain().find(
{nFavorites: {$gte: 100000}},
{_id: 0, nFavorites: 1, username: 1})
.sort({nFavorites: -1})
#MDBW17
IS YOUR QUERY USING THE INDEX YOU EXPECT?
db.tweets.explain().find(
{nFavorites: {$gte: 100000}},
{_id: 0, nFavorites: 1, username: 1}).sort({nFavorites: -1})
{ "queryPlanner": {
"winningPlan": {
"stage": "PROJECTION",
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": {"nFavorites": -1},
"indexBounds": {
"nFavorites": ["[inf.0, 100000.0]"]
} } } },
"rejectedPlans": [ ] } }
#MDBW17
IS YOUR QUERY USING AN INDEX TO PROVIDE THE
SORT?
#MDBW17
IS YOUR QUERY USING AN INDEX TO PROVIDE THE
SORT?
FETCH
INDEX SCAN
✓ ✗FETCH
INDEX SCAN
SORT
#MDBW17
IS YOUR QUERY USING AN INDEX TO PROVIDE THE
SORT?
#MDBW17
db.tweets.explain().find(
{nFavorites: {$gte: 100000}},
{_id: 0, nFavorites: 1, username: 1}).sort({nFavorites: -1})
{ "queryPlanner": {
"winningPlan": {
"stage": "PROJECTION",
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": {"nFavorites": -1},
"indexBounds": {
"nFavorites": ["[inf.0, 100000.0]"]
} } } },
"rejectedPlans": [ ] } }
IS YOUR QUERY USING AN INDEX TO PROVIDE THE
SORT?
NO SORT STAGE ✅
#MDBW17
SORT_MERGE IS OK
✓SORT_MERGE
INDEX SCAN
FETCH
INDEX SCAN
#MDBW17
BONUS: IS YOUR QUERY USING AN INDEX TO
PROVIDE THE PROJECTION?
#MDBW17
COMPOUND INDEX TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
INDEX:
{username: 1, nFavorites: -1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEng" 83092
"@MongoDBEng" 76032
… …
#MDBW17
COMPOUND INDEX
db.tweets.find({
username: {$in: ["@MongoDBEng", "@MongoDB"]},
nFavorites: {$gt: 50000}}})
TWITTER.TWEETS
INDEX:
{username: 1, nFavorites: -1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEng" 83092
"@MongoDBEng" 76032
… …
#MDBW17
COMPOUND INDEX
db.tweets.find(
{username: {$in: ["@MongoDBEng", "@MongoDB"]}, nFavorites: {$gt: 50000}}},
{_id: 0, username: 1, nFavorites: 1})
TWITTER.TWEETS
INDEX:
{username: 1, nFavorites: -1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEng" 83092
"@MongoDBEng" 76032
… …
#MDBW17
COMPOUND INDEX
db.tweets.find(
{username: {$in: ["@MongoDBEng", "@MongoDB"]}, nFavorites: {$gt: 50000}}},
{_id: 0, username: 1, nFavorites: 1})
TWITTER.TWEETS
{username: 1, nFavorites:
-1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEn
g"
83092
"@MongoDBEn
g"
76032
… …
INDEX SCAN
PROJECTION
#MDBW17
COMPOUND INDEX
db.tweets.find(
{username: {$in: ["@MongoDBEng", "@MongoDB"]}, nFavorites: {$gt: 50000}}},
{_id: 0, username: 1, nFavorites: 1})
TWITTER.TWEETS
{username: 1, nFavorites:
-1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEn
g"
83092
"@MongoDBEn
g"
76032
… …
INDEX SCAN
PROJECTION
"COVERED"
#MDBW17
COMPOUND INDEX
db.tweets.find(
{username: {$in: ["@MongoDBEng", "@MongoDB"]}, nFavorites: {$gt: 50000}}},
{_id: 0, username: 1, nFavorites: 1, other: 1})
{username: 1, nFavorites:
-1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEn
g"
83092
"@MongoDBEn
g"
76032
… …
TWITTER.TWEETS
INDEX SCAN
PROJECTION
FETCH
"NOT COVERED"
#MDBW17
COMPOUND INDEX
db.tweets.find(
{username: {$in: ["@MongoDBEng", "@MongoDB"]}, nFavorites: {$gt: 50000}}},
{_id: 0, username: 1, nFavorites: 1})
.sort({username: 1})
TWITTER.TWEETS
{username: 1, nFavorites:
-1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEn
g"
83092
"@MongoDBEn
g"
76032
… …
INDEX SCAN
PROJECTION
"COVERED"
PROJECTION
"COVERED"
SORT
#MDBW17
PROJECTION
INDEX SCAN
✓ ✗
PROJECTION
INDEX SCAN
FETCH
IS YOUR QUERY USING AN INDEX TO PROVIDE THE
PROJECTION?
#MDBW17
THE POWER OF "QUERYPLANNER"
• Is your query using an index? Which one?
• Is your query using an index to provide the sort?
• Is your query using an index to provide the projection?
#MDBW17
NEXT UP: "IT'S USING AN INDEX, SO WHAT'S TAKING
SO LONG?"
db.tweets.explain().find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
FETCH
INDEX SCAN
keyPattern: {createdDate: 1}
#MDBW17
IT'S USING AN INDEX, SO WHAT'S TAKING SO LONG?
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
FETCH
INDEX SCAN
keyPattern: {createdDate: 1}
12:02
12:03
12:04
…
INDEX SCAN
INDEX:
{createdAt: 1}
#MDBW17
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
{createdDate: 12:02,
favorites: [
"@MongoDB",
"@taylorswift"
]}
FETCH
FETCH
filter: {
favorites: "@eliothorowitz"
}
INDEX SCAN
keyPattern: {createdDate: 1}
IT'S USING AN INDEX, SO WHAT'S TAKING SO LONG?
12:02
12:03
12:04
…
INDEX:
{createdAt: 1}
#MDBW17
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
{createdDate: 12:02,
favorites: [
"@MongoDB",
"@taylorswift"
]}
FETCH
FETCH
filter: {
favorites: "@eliothorowitz"
}
INDEX SCAN
keyPattern: {createdDate: 1}
❌
IT'S USING AN INDEX, SO WHAT'S TAKING SO LONG?
12:02
12:03
12:04
…
INDEX:
{createdAt: 1}
#MDBW17
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
{createdDate: 12:03,
favorites: [
"@eliothorowitz",
"@taylorswift"
]}
FETCH
FETCH
filter: {
favorites: "@eliothorowitz"
}
INDEX SCAN
keyPattern: {createdDate: 1}
IT'S USING AN INDEX, SO WHAT'S TAKING SO LONG?
12:02
12:03
12:04
…
INDEX:
{createdAt: 1}
#MDBW17
SO HOW MANY OF THEM WERE THROWN OUT?
• What percentage of the index keys in the scanned range ended up
matching the predicate?
• What's the selectivity?
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
01: OUTPUT IS VERY LARGE
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
EXPLAIN MODE: "QUERYPLANNER"
> db.collection.find(…).explain()
{"queryPlanner" : {
"winningPlan" : {
{"stage" : "SORT",
"inputStage" : {…}
}}
},
"rejectedPlans" : [
{"stage" : "SORT",
"inputStage" : {…}
}}
…
]
}}
#MDBW17
• "executionStats"
EXPLAIN MODE: "EXECUTIONSTATS"
created by Mike Ashley from Noun Project
created by Creative Stall from Noun Project
#MDBW17
EXPLAIN MODE: "EXECUTIONSTATS"
> db.tweets.find(…).explain("executionStats")
{
"queryPlanner" : {
…
"winningPlan" : {…},
"rejectedPlans" : […]
},
"executionStats": { // New!
…,
"executionStages": {…}
}
…
}
#MDBW17
DETAILS: "EXECUTIONSTATS"
> db.tweets.find(…).explain("executionStats")
{
"queryPlanner" : { /* Same as before. */ },
"executionStats": {
// Top-level stats.
"executionStages": {
stage: "SORT",
// Sort stats.
inputStage: {
// etc, etc.

}
}
}
…
}
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
> db.tweets.find(…).explain("executionStats")
{
…,
"executionStats" : {
// Top-level stats.
"nReturned" : 390000,
"executionTimeMillis" : 4431,
"totalKeysExamined" : 390000,
"totalDocsExamined" : 390000,
"executionStages" : {…}
},
}
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
DETAILS: "EXECUTIONSTATS"
#MDBW17
db.tweets.find(…).explain("executionStats")
{
"executionStats" : {
// Top-level stats.
"executionStages" : {
"stage" : "SORT",
"nReturned" : 390000,
"executionTimeMillisEstimate" : 2030,
…
"sortPattern" : { "nFollowers" : 1 },
"memUsage" : 20280000,
"memLimit" : 33554432,
"inputStage" : {…}
}
}
}
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
DETAILS: "EXECUTIONSTATS"
#MDBW17
db.tweets.find(…).explain("executionStats")
{
"executionStats" : {
// Top-level stats.
"executionStages" : {
"stage" : "SORT",
"nReturned" : 390000,
"executionTimeMillisEstimate" : 2030,
…
"sortPattern" : { "nFollowers" : -1 },
"memUsage" : 20280000,
"memLimit" : 33554432,
"inputStage" : {…}
}
}
}
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
DETAILS: "EXECUTIONSTATS"
#MDBW17
db.tweets.find(…).explain("executionStats")
{
"executionStats" : {
// Top-level stats.
"executionStages" : {
"stage" : "SORT",
"nReturned" : 390000,
"executionTimeMillisEstimate" : 2030,
"works" : 780003,
"advanced" : 390000,
"needTime" : 390002,
"isEOF" : 1,
"sortPattern" : { "b" : 1 },
…
"inputStage" : {…}
}
}
}
? FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
DETAILS: "EXECUTIONSTATS"
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
• These are all PlanStages
‒SortStage
‒FetchStage
‒IndexScanStage
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
• These are all PlanStages
• Each PlanStage implements
work()
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
• These are all PlanStages
• Each PlanStage implements
work(), returns one of:
• ADVANCED
• NEED_TIME
• IS_EOF
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
work()
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
work()
work()
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
work()
work()
work()
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
work()
work()
ADVANCED ID
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
ADVANCED {…}
work()
ADVANCED
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
SORT
EXECUTION STATS: WORKS, ADVANCED, ETC.
NEED_TIME ADVANCED
work()
ADVANCED
FETCH
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
DETAILS: "EXECUTIONSTATS"
db.tweets.find(…).explain("executionStats")
{
"executionStats" : {
// Top-level stats.
"executionStages" : {
"stage" : "SORT",
"nReturned" : 390000,
"executionTimeMillisEstimate" : 2030,
"works" : 780003,
"advanced" : 390000,
"needTime" : 390002,
"isEOF" : 1,
"sortPattern" : { "b" : 1 },
…
"inputStage" : {…}
}
}
}
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
DETAILS: "EXECUTIONSTATS"
> db.tweets.find(…).explain("executionStats")
{"executionStats": {
"executionStages": {
stage: "SORT",
// Sort stats, includes "works", "advanced", …
inputStage: {
stage: "FETCH",
// Fetch stats, includes "works", "advanced", …
inputStage: {

// etc, etc.
}

}
}
}
…
}
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXPLAIN MODE: "EXECUTIONSTATS"
> db.tweets.find(…).explain("executionStats")
{
"queryPlanner" : {
…
"winningPlan" : {…},
"rejectedPlans" : […]
},
"executionStats": { // New!
…,
"executionStages": {…}
}
…
}
APPLYING THIS INFORMATION
#MDBW17
HOW SELECTIVE IS YOUR INDEX?
#MDBW17
HOW SELECTIVE IS YOUR INDEX?
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
12:02
12:03
12:04
12:06
…
INDEX SCAN
FETCH
INDEX SCAN
keyPattern: {createdDate: -1}
#MDBW17
HOW SELECTIVE IS YOUR INDEX?
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
{
"executionStats" : {
"nReturned" : 314,
"totalKeysExamined" : 2704, // < 12% matched
…
}
FETCH
INDEX SCAN
keyPattern: {createdDate: -1}
#MDBW17
WHAT'S THE MOST EXPENSIVE PART OF YOUR PLAN?
#MDBW17
WHAT'S THE MOST EXPENSIVE PART OF YOUR PLAN?
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
}) FETCH
filter: {
favorites: "@eliothorowitz"
}
INDEX SCAN
keyPattern: {createdDate: 1}
#MDBW17
WHAT'S THE MOST EXPENSIVE PART OF YOUR PLAN?
db.tweets.explain("executionStats").find(…)
FETCH
executionTimeMillisEstimate: 431
INDEX SCAN
executionTimeMillisEstimate: 67
#MDBW17
WHAT'S THE MOST EXPENSIVE PART OF YOUR PLAN?
db.tweets.explain("executionStats").find(…)
FETCH
works: 2705
advanced: 314
needTime: 2391
INDEX SCAN
#MDBW17
OUR PROGRESS
• "queryPlanner"
• Is your query using the index you expect?
• Is your query using an index to provide the sort?
• Is your query using an index to provide the projection?
• "executionStats"
• How selective is your index?
• Which part of your plan is the most expensive?
#MDBW17
NEXT UP: "WHY WAS THIS PLAN CHOSEN?"
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
• We had an index on {favorites: 1}, would that have been
faster?
🤔
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
EXPLAIN MODE: "QUERYPLANNER"
❓
> db.collection.find(…).explain()
{"queryPlanner" : {
"winningPlan" : {
{"stage" : "SORT",
"inputStage" : {…}
}}
},
"rejectedPlans" : [
{"stage" : "SORT",
"inputStage" : {…}
}}
…
]
}}
#MDBW17
QUERY PLANNING
#MDBW17
• MultiPlanStage::pickBestPlan()
QUERY PLANNING
…
MultiPlanStage
work()
work()
work()
#MDBW17
• MultiPlanStage::pickBestPlan()
QUERY PLANNING
…
MultiPlanStage
ADVANCED
NEED_TIME
ADVANCED
#MDBW17
• MultiPlanStage::pickBestPlan()
QUERY PLANNING
…
MultiPlanStage
Advances: 78 22 50
#MDBW17
• MultiPlanStage::pickBestPlan()
QUERY PLANNING
…
MultiPlanStage
Advances: 78 22 50
#MDBW17
EXPLAIN MODE: "ALLPLANSEXECUTION"
> db.tweets.find(…).explain("allPlansExecution")
{
"queryPlanner" : {
…
"winningPlan" : {…},
"rejectedPlans" : […]
},
"executionStats": {
…,
"executionStages": {…},
"allPlansExecution": […] // New!
}
…
}
#MDBW17
EXPLAIN MODE: "QUERYPLANNER"
> db.collection.find(…).explain()
{"queryPlanner" : {
"winningPlan" : {…}
},
"rejectedPlans" : [
{…},
…
],
}}
#MDBW17
EXPLAIN MODE: "EXECUTIONSTATS"
> db.collection.find(…).explain()
{"queryPlanner" : {
"winningPlan" : {…}
},
"rejectedPlans" : [
{…},
…
],
"executionStats": {

"executionStages": {…}
}
}}
#MDBW17
EXPLAIN MODE: "ALLPLANSEXECUTION"
> db.collection.find(…).explain()
{"queryPlanner" : {
"winningPlan" : {…}
},
"rejectedPlans" : [
{…},
…
],
"executionStats": {

"executionStages": {…}
"allPlansExecution": [

{…},
{…},
…
]
}
}}
#MDBW17
EXPLAIN MODE: "ALLPLANSEXECUTION"
db.tweets.explain("allPlansExecution").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
{
"executionStats": {
"allPlansExecution": [
{nReturned: 34,
executionStages: { /* Index Scan on "favorites" */ }
},
{nReturned: 101,
executionStages: { /* Index Scan on "createdDate" */ }
}
]
}
…
}
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
SLOW QUERIES
• Queries with response time >100ms (server side) are logged:
2017-05-25T10:01:58.917-0400 I COMMAND [conn7] command twitter.tweets appName: "MongoDB Shell" command: find
{ find: "tweets", filter: { nFavorites: { $gte: 10000.0 } }, limit: 20.0, singleBatch: false, sort:
{ nFavorites: -1.0, username: 1.0 }, projection: { _id: 0.0, nFavorites: 1.0, username: 1.0 } } planSummary:
IXSCAN { nFavorites: -1 } keysExamined:359907 docsExamined:359907 hasSortStage:1 cursorExhausted:1 numYields:
2871 nreturned:20 reslen:1087 locks:{ Global: { acquireCount: { r: 5744 } }, Database: { acquireCount: { r: 2872
} }, Collection: { acquireCount: { r: 2872 } } } protocol:op_command 1493ms
#MDBW17
SLOW QUERIES
• Queries with response time >100ms (server side) are logged:
2017-05-25T10:01:58.917-0400 I COMMAND [conn7] command twitter.tweets appName: "MongoDB Shell" command: find
{ find: "tweets", filter: { nFavorites: { $gte: 10000.0 } }, limit: 20.0, singleBatch: false, sort:
{ nFavorites: -1.0, username: 1.0 }, projection: { _id: 0.0, nFavorites: 1.0, username: 1.0 } } planSummary:
IXSCAN { nFavorites: -1 } keysExamined:359907 docsExamined:359907 hasSortStage:1 cursorExhausted:1 numYields:
2871 nreturned:20 reslen:1087 locks:{ Global: { acquireCount: { r: 5744 } }, Database: { acquireCount: { r: 2872
} }, Collection: { acquireCount: { r: 2872 } } } protocol:op_command 1493ms
#MDBW17
SLOW QUERIES
• Queries with response time >100ms (server side) are logged:
2017-05-25T10:01:58.917-0400 I COMMAND [conn7] command twitter.tweets appName: "MongoDB Shell" command:
find { find: "tweets", filter: { nFavorites: { $gte: 10000.0 } }, limit: 20.0,
singleBatch: false, sort: { nFavorites: -1.0, username: 1.0 }, projection: { _id: 0.0,
nFavorites: 1.0, username: 1.0 } } planSummary: IXSCAN { nFavorites: -1 } keysExamined:359907
docsExamined:359907 hasSortStage:1 cursorExhausted:1 numYields:2871 nreturned:20 reslen:1087 locks:{ Global:
{ acquireCount: { r: 5744 } }, Database: { acquireCount: { r: 2872 } }, Collection: { acquireCount: { r:
2872 } } } protocol:op_command 1493ms
#MDBW17
SLOW QUERIES
• Queries with response time >100ms (server side) are logged:
2017-05-25T10:01:58.917-0400 I COMMAND [conn7] command twitter.tweets appName: "MongoDB Shell" command: find
{ find: "tweets", filter: { nFavorites: { $gte: 10000.0 } }, limit: 20.0, singleBatch: false, sort:
{ nFavorites: -1.0, username: 1.0 }, projection: { _id: 0.0, nFavorites: 1.0, username: 1.0 } } planSummary:
IXSCAN { nFavorites: -1 } keysExamined:359907 docsExamined:359907 hasSortStage:1
cursorExhausted:1 numYields:2871 nreturned:20 reslen:1087 locks:{ Global: { acquireCount: { r: 5744 } },
Database: { acquireCount: { r: 2872 } }, Collection: { acquireCount: { r: 2872 } } } protocol:op_command 1493ms
#MDBW17
SLOW QUERIES
• Queries with response time >100ms (server side) are logged.
• Configurable via profiling parameter 'slowMs'
#MDBW17
THE PROFILE
• If turned on, queries show up in the system.profile collection
{ "op": "query",
"ns": "twitter.tweets",
"query": { "find": "tweets", "filter": { … }, "limit": 20, "sort": { … }, "projection": { … } },
"millis": 1355,
"planSummary": "IXSCAN { nFavorites: -1 }",
"execStats": {
"stage": "PROJECTION",
"inputStage": {
"stage": "SORT",
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
} } } } } }
#MDBW17
OTHER COMMANDS
db.runCommand({
explain: {/* command */},
verbosity: <queryPlanner|executionStats|allPlansExecution>
})
#MDBW17
OTHER COMMANDS
db.runCommand({
explain: {findAndModify: {…}},
verbosity: <queryPlanner|executionStats|allPlansExecution>
})
#MDBW17
OTHER COMMANDS
db.runCommand({
explain: {update: {…}},
verbosity: <queryPlanner|executionStats|allPlansExecution>
})
#MDBW17
OTHER COMMANDS
db.runCommand({
explain: {aggregate: {…}},
verbosity: <queryPlanner|executionStats|allPlansExecution>
})
#MDBW17
AGGREGATION
• Aggregation is special…
runCommand({
aggregate: "collection",
pipeline: […],
explain: <true|false>
})
#MDBW17
AGGREGATION
• Aggregation is was special…
• 3.4 and earlier:
• 3.6 and beyond:
runCommand({
aggregate: "collection",
pipeline: […],
explain: <true|false>
})
runCommand({explain: {
aggregate: "collection",
pipeline: […],
},
verbosity: "…" })
#MDBW17
AGGREGATION
db.explain().aggregate([{$group: {…}}, {$project: {…}}])
{
stages: [
{$cursor: {…}},
{$group: {…}},
{$project: {…}},
]
}
#MDBW17
AGGREGATION
db.explain().aggregate([{$group: {…}}, {$project: {…}}])
{
stages: [
{$cursor: {
query: {…},
fields: {…},
queryPlanner: {/* same as query explain! */},
executionStats: {/* 3.6+ only, same as query explain! */}
}},
{$group: {…}},
{$project: {…}} ] }
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
SUMMARY
SOME FINAL THOUGHTS
#MDBW17
01: OUTPUT IS VERY LARGE
#MDBW17
COMPASS SHOUTOUT
#MDBW17
COMPASS SHOUTOUT
#MDBW17
COMPASS SHOUTOUT
#MDBW17
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
Your Application
MongoDB
created by Mike Ashley from Noun Project
#MDBW17
Your Application MongoDB
Can I see all the tweets
with hashtag
"#MDBW17" from this
hour?
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
Your Application MongoDB
Hmm… Let me
think about
that…
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
Your Application MongoDB
Ah! Here are
your results!
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
Your Application MongoDB
What took you
so long?!
#MDBW17
Your Application MongoDB
What took you
so long?!
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
Your Application MongoDB
What took you
so long?!
- network latency
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
Your Application MongoDB
What took you
so long?!
- network latency
- large result set
{…} {…} {…} {…} {…} {…} {…}
{…}
{…}
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
Your Application MongoDB
What took you
so long?!
- network latency
- large result set
- server contention
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
Your Application MongoDB
What took you
so long?!
- network latency
- large result set
- server contention
- query planning problem
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
Deciphering Explain Output

More Related Content

What's hot (20)

PPTX
ChordアルゴリズムによるDHT入門
Hiroya Nagao
 
PDF
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
CONNECT FOUNDATION
 
PDF
分散ワークフローエンジン『Digdag』の実装 at Tokyo RubyKaigi #11
Sadayuki Furuhashi
 
PPTX
コンソールアプリケーションでDIを使う
Core Concept Technologies
 
PPTX
R言語による簡便な有意差の検出と信頼区間の構成
Toshiyuki Shimono
 
PDF
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
Nozomu Kaneko
 
PDF
Collaborativefilteringwith r
Teito Nakagawa
 
PPTX
DDDモデリング勉強会 #6
株式会社Jurabi
 
PDF
爆速クエリエンジン”Presto”を使いたくなる話
Kentaro Yoshida
 
PDF
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
hirokiky
 
PPTX
設計書からの卒業
Fumiyasu Sumiya
 
PDF
論文紹介: Cuckoo filter: practically better than bloom
Sho Nakazono
 
PDF
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
PPTX
HashMapとは?
Trash Briefing ,Ltd
 
PDF
不遇の標準ライブラリ - valarray
Ryosuke839
 
PDF
ニワトリでもわかるECS入門
Yoshiki Kobayashi
 
PDF
パッケージングを支える技術 pyconjp2016
Atsushi Odagiri
 
PDF
VirtualBox と Rocky Linux 8 で始める Pacemaker ~ VirtualBox でも STONITH 機能が試せる! Vi...
ksk_ha
 
PDF
Grafana Dashboards as Code
Takuhiro Yoshida
 
PDF
2022_sakura-yube_ddd.pdf
toshiki kawai
 
ChordアルゴリズムによるDHT入門
Hiroya Nagao
 
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
CONNECT FOUNDATION
 
分散ワークフローエンジン『Digdag』の実装 at Tokyo RubyKaigi #11
Sadayuki Furuhashi
 
コンソールアプリケーションでDIを使う
Core Concept Technologies
 
R言語による簡便な有意差の検出と信頼区間の構成
Toshiyuki Shimono
 
すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)
Nozomu Kaneko
 
Collaborativefilteringwith r
Teito Nakagawa
 
DDDモデリング勉強会 #6
株式会社Jurabi
 
爆速クエリエンジン”Presto”を使いたくなる話
Kentaro Yoshida
 
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
hirokiky
 
設計書からの卒業
Fumiyasu Sumiya
 
論文紹介: Cuckoo filter: practically better than bloom
Sho Nakazono
 
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
HashMapとは?
Trash Briefing ,Ltd
 
不遇の標準ライブラリ - valarray
Ryosuke839
 
ニワトリでもわかるECS入門
Yoshiki Kobayashi
 
パッケージングを支える技術 pyconjp2016
Atsushi Odagiri
 
VirtualBox と Rocky Linux 8 で始める Pacemaker ~ VirtualBox でも STONITH 機能が試せる! Vi...
ksk_ha
 
Grafana Dashboards as Code
Takuhiro Yoshida
 
2022_sakura-yube_ddd.pdf
toshiki kawai
 

Viewers also liked (6)

PDF
MongoDB Performance Tuning
Puneet Behl
 
PDF
MongoDB World 2016: Deciphering .explain() Output
MongoDB
 
PDF
MongoDB WiredTiger Internals
Norberto Leite
 
PDF
MongodB Internals
Norberto Leite
 
KEY
MongoDB: How it Works
Mike Dirolf
 
PDF
Inside MongoDB: the Internals of an Open-Source Database
Mike Dirolf
 
MongoDB Performance Tuning
Puneet Behl
 
MongoDB World 2016: Deciphering .explain() Output
MongoDB
 
MongoDB WiredTiger Internals
Norberto Leite
 
MongodB Internals
Norberto Leite
 
MongoDB: How it Works
Mike Dirolf
 
Inside MongoDB: the Internals of an Open-Source Database
Mike Dirolf
 
Ad

Similar to Deciphering Explain Output (20)

PPTX
Reading the .explain() Output
MongoDB
 
PDF
The Query Engine: The Life of a Read
MongoDB
 
PPTX
MongoDB.local DC 2018: Tips and Tricks for Avoiding Common Query Pitfalls
MongoDB
 
PDF
Introduction to-mongo db-execution-plan-optimizer-final
M Malai
 
PDF
Introduction to Mongodb execution plan and optimizer
Mydbops
 
PPTX
Index Usage for Nested Logical Queries
MongoDB
 
PDF
Mdb dn 2016_06_query_primer
Daniel M. Farrell
 
PDF
Query planner
Miguel Angel Nieto
 
PPTX
Performance and Security Enhancements in MongoDB's BI Connector
MongoDB
 
PPTX
Webinar: Index Tuning and Evaluation
MongoDB
 
PDF
Imply at Apache Druid Meetup in London 1-15-20
Jelena Zanko
 
PPTX
Using Compass to Diagnose Performance Problems in Your Cluster
MongoDB
 
PPTX
Using Compass to Diagnose Performance Problems
MongoDB
 
PPTX
Webinar: Performance Tuning + Optimization
MongoDB
 
PDF
What’s New in the Upcoming Apache Spark 3.0
Databricks
 
PDF
What's New in MongoDB 8.0 - Mydbops MyWebinar Edition 34
Mydbops
 
PPTX
Doing Joins in MongoDB: Best Practices for Using $lookup
MongoDB
 
PPTX
Automated Slow Query Analysis: Dex the Index Robot
MongoDB
 
PDF
Mongo db improve the performance of your application codemotion2016
Juan Antonio Roy Couto
 
PPTX
Advanced Schema Design Patterns
MongoDB
 
Reading the .explain() Output
MongoDB
 
The Query Engine: The Life of a Read
MongoDB
 
MongoDB.local DC 2018: Tips and Tricks for Avoiding Common Query Pitfalls
MongoDB
 
Introduction to-mongo db-execution-plan-optimizer-final
M Malai
 
Introduction to Mongodb execution plan and optimizer
Mydbops
 
Index Usage for Nested Logical Queries
MongoDB
 
Mdb dn 2016_06_query_primer
Daniel M. Farrell
 
Query planner
Miguel Angel Nieto
 
Performance and Security Enhancements in MongoDB's BI Connector
MongoDB
 
Webinar: Index Tuning and Evaluation
MongoDB
 
Imply at Apache Druid Meetup in London 1-15-20
Jelena Zanko
 
Using Compass to Diagnose Performance Problems in Your Cluster
MongoDB
 
Using Compass to Diagnose Performance Problems
MongoDB
 
Webinar: Performance Tuning + Optimization
MongoDB
 
What’s New in the Upcoming Apache Spark 3.0
Databricks
 
What's New in MongoDB 8.0 - Mydbops MyWebinar Edition 34
Mydbops
 
Doing Joins in MongoDB: Best Practices for Using $lookup
MongoDB
 
Automated Slow Query Analysis: Dex the Index Robot
MongoDB
 
Mongo db improve the performance of your application codemotion2016
Juan Antonio Roy Couto
 
Advanced Schema Design Patterns
MongoDB
 
Ad

More from MongoDB (20)

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

Recently uploaded (20)

PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PDF
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
PDF
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
PDF
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
Advancing WebDriver BiDi support in WebKit
Igalia
 
PPTX
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PDF
Biography of Daniel Podor.pdf
Daniel Podor
 
PDF
IoT-Powered Industrial Transformation – Smart Manufacturing to Connected Heal...
Rejig Digital
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
Advancing WebDriver BiDi support in WebKit
Igalia
 
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
Biography of Daniel Podor.pdf
Daniel Podor
 
IoT-Powered Industrial Transformation – Smart Manufacturing to Connected Heal...
Rejig Digital
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 

Deciphering Explain Output