SlideShare a Scribd company logo
1 of 134
#MDBlocal
PIPELINE POWER
DOING MORE WITH MONGODB AGGREGATION
Ankur Raina MongoDB Inc @rainaankur92
#MDBlocal
STORE
RETRIEVE
APPLICATIONS & DATA
#MDBlocal
STORE
RETRIEVE
QUERY & ANALYTICS
APPLICATIONS & DATA
#MDBlocal
STORE
RETRIEVE
find() & aggregate()
APPLICATIONS & DATA
#MDBlocal
#MDBlocal
OPTIONS FOR ANALYTICS
pre-aggregate
analyze
in MongoDB
analyze elsewhere
#MDBlocal
pre-aggregate
analyze
in MongoDB
analyze
elsewhere
OPTIONS FOR ANALYTICS
#MDBlocal
pre-aggregate
analyze
in MongoDB
analyze
elsewhere
OPTIONS FOR ANALYTICS
#MDBlocal
#MDBlocal
#MDBlocal
#MDBlocal
#MDBlocal
pre-aggregate
analyze
in MongoDB
analyze elsewhere
OPTIONS FOR ANALYTICS
#MDBlocal
ANALYTICS = AGGREGATION
pre-aggregate
analyze
in MongoDB
analyze elsewhere
#MDBlocal
PIPELINE
#MDBlocal
ps ax | grep mongod | head 1
*nix command line pipe
PIPELINE
#MDBlocal
$match $group | $sort|
Input stream {} {} {}{} Result {} {}...
PIPELINE
MongoDB document pipeline
#MDBlocal
Stage 1 Stage 2 Stage 3 Stage 4
{}{}{}{}
{}{}{}{}
DATA PIPELINE
{}{}{}{}
{"$stage":{ ... }}
START
Collection
View
Special stage
STAGES
{title: "The Great Gatsby",
language: "English",
subjects: "Long Island"}
{title: "The Great Gatsby",
language: "English",
subjects: "New York"}
{title: "The Great Gatsby",
language: "English",
subjects: "1920s"}
{title: "The Great Gatsby",
language: "English",
subjects: [
"Long Island",
"New York",
"1920s"] },
{"$match":{"language":"English"}}
$match
{ _id:"Long Island",
count: 1 },
$group
{ _id: "New York",
count: 2 },
$unwind
{ _id: "1920s",
count: 1 },
$sort $skip$limit $project
{"$unwind":"$subjects"}
{"$group":{"_id":"$subjects", "count":{"$sum:1}}
{ _id: "Harlem",
count: 1 },
{ _id: "Long Island",
count: 1 },
{ _id: "New York",
count: 2 },
{ _id: "1920s",
count: 1 },
{title: "Open City",
language: "English",
subjects: [
"New York"
"Harlem" ] }
{ title: "The Great Gatsby",
language: "English",
subjects: [
"Long Island",
"New York",
"1920s"] },
{ title: "War and Peace",
language: "Russian",
subjects: [
"Russia",
"War of 1812",
"Napoleon"] },
{ title: "Open City",
language: "English",
subjects: [
"New York",
"Harlem" ] },
{title: "Open City",
language: "English",
subjects: "New York"}
{title: "Open City",
language: "English",
subjects: "Harlem"}
{ _id: "Harlem",
count: 1 },
{"$sort:{"count":-1}
{"$limit":3}
{"$project":...}
STAGES
Group
and
Transform
Aliases
Special
• Input
• Output
Reorder
Transform
Decrease
Increase
{title: "The Great Gatsby",
language: "English",
subjects: "Long Island"}
{title: "The Great Gatsby",
language: "English",
subjects: "New York"}
{title: "The Great Gatsby",
language: "English",
subjects: "1920s"}
{title: "The Great Gatsby",
language: "English",
subjects: [
"Long Island",
"New York",
"1920s"] },
$match
{ _id:"Long Island",
count: 1 },
$group
{ _id: "New York",
count: 2 },
$unwind
{ _id: "1920s",
count: 1 },
$sort $skip$limit $project
{ _id: "Harlem",
count: 1 },
{ _id: "Long Island",
count: 1 },
{ _id: "New York",
count: 2 },
{ _id: "1920s",
count: 1 },
{title: "Open City",
language: "English",
subjects: [
"New York"
"Harlem" ] }
{ title: "The Great Gatsby",
language: "English",
subjects: [
"Long Island",
"New York",
"1920s"] },
{ title: "War and Peace",
language: "Russian",
subjects: [
"Russia",
"War of 1812",
"Napoleon"] },
{ title: "Open City",
language: "English",
subjects: [
"New York",
"Harlem" ] },
{title: "Open City",
language: "English",
subjects: "New York"}
{title: "Open City",
language: "English",
subjects: "Harlem"}
{ _id: "Harlem",
count: 1 },
{"$match":{"language":"English"}}
{"$unwind":"$subjects"}
{"$group":{"_id":"$subjects", "count":{"$sum:1}}
{"$sort:{"count":-1}
{"$limit":3}
{"$project":...}
#MDBlocal
STREAMING VS BLOCKING
{title: "The Great Gatsby",
language: "English".
subjects: "Long Island"}
{title: "The Great Gatsby",
language: "English",
subjects: "New York"}
{title: "The Great Gatsby",
language: "English",
subjects: "1920s"}
{title: "The Great Gatsby",
language: "English",
subjects: [
"Long Island",
"New York",
"1920s"] },
$match
{ _id:"Long Island",
count: 1 },
$group
{ _id: "New York",
count: 2 },
$unwind
{ _id: "1920s",
count: 1 },
$sort $skip$limit $project
{ _id: "Harlem",
count: 1 },
{ _id:"LongIsland",
count: 1 },
{ _id: "New York",
count: 2 },
{ _id: "1920s",
count: 1 },
{title: "Open City",
language: "English",
subjects: [
"New York"
"Harlem" ] }
{ title: "The Great Gatsby",
language: "English",
subjects: [
"Long Island",
"New York",
"1920s"] },
{ title: "War and Peace",
language: "Russian",
subjects: [
"Russia",
"War of 1812",
"Napoleon"] },
{ title: "Open City",
language: "English",
subjects: [
"New York",
"Harlem" ] },
{title: "Open City",
language: "English",
subjects: "New York"}
{title: "Open City",
language: "English",
subjects: "Harlem"}
{ _id: "Harlem",
count: 1 },
$group $sort
1
{"$match":{"language":"English"}}
{"$unwind":"$subjects"}
{"$group":{"_id":"$subjects", "count":{"$sum:1}}
{"$sort:{"count":-1}
{"$limit":3}
{"$project":...}
Group
and
Transform
Aliases
Special
• Input
• Output
Reorder
Transform
Decrease
Increase
#MDBlocal
INPUT STAGE RESULTSSTAGE
STREAMING RESOURCE USE
#MDBlocal
Each document is streamed through RAM
STREAMING RESOURCE USE
#MDBlocal
INPUT STAGE RESULTSSTAGE
BLOCKING RESOURCE USE
#MDBlocal
Sort with Limit:
sizeOfAvgDoc * Limit + sizeOfAvgDoc
Sort without Limit:
sizeOfAllDocs
Group:
sizeOfAvgDoc * numberOfGroups + sizeOfAvgDoc
BLOCKING RESOURCE USE
# M D B l o c a l
EXPRESSIONS
#MDBlocal
# M D B l o c a l
ARRAY EXPRESSIONS
#MDBlocal
$arrayElemAt
$concatArrays
$indexOfArray
$isArray
$size
$range
$reverseArray
$map
$reduce
$filter
$slice
$zip
$in
... plus all the set expressions
ARRAY EXPRESSIONS
#MDBlocal
$arrayElemAt
$concatArrays
$indexOfArray
$isArray
$size
$range
$reverseArray
$map
$reduce
$filter
$slice
$zip
$in
... plus all the set expressions
ARRAY EXPRESSIONS
#MDBlocal
$map
input: array
output: array
$filter
input: array
output: subset of array
$reduce
input: array
output: anything
you
want
ARRAY EXPRESSIONS
#MDBlocal
"arr":[{"a":1},{"a":99},{"a":5},{"a":3}]
{"$map":{
"input":"$arr",
"in":"$$this"
}}
{"$map":{
"input":"$arr",
"as":"eachElem",
"in":{"b":"$$eachElem.a"}
}}
{"$map":{
"input":{"$range":[0,{"$size":"$arr"}]},
"as":"index",
"in":{"c":{"$arrayElemAt":["$arr.a","$$index"]}}
}}
"a" 1
"a" 99
"a" 5
"a" 3
"b" 1
"b" 99
"b" 5
"b" 3
"c" 1
"c" 99
"c" 5
"c" 3
"a" 1
"a" 99
"a" 5
"a" 3
"a" 1
"a" 99
"a" 5
"a" 3
0
1
2
3
{"$map":{
"input":"$arr",
"as":"var",
"in":"$$var" }}
$map
{"$map":{
"input":"$arr.a",
"as":"eachElem",
"in":{"b":"$$eachElem"}}}
ARRAY EXPRESSIONS
1
99
5
3
#MDBlocal
"arr":[{"a":1},{"a":99},{"a":5},{"a":3}]
{"$filter": {
"input":"$arr",
"cond":{"$lt":["$$this.a",10]}
}}
{"$filter":{
"input":"$arr.a",
"as":"elem",
"cond":{"$lt":["$$elem",10]}
}}
ARRAY EXPRESSIONS
"a" 1
"a" 99
"a" 5
"a" 3
$filter
"a" 1
"a" 5
"a" 3
#MDBlocal
"arr":[{"a":1},{"a":99},{"a":5},{"a":3}]
{"$reduce":{
"input":"$arr",
"initialValue": 0,
"in":{$add:["$$value","$$this.a"]}
}}
ARRAY EXPRESSIONS $reduce
01100105108
"a" 1
"a" 99
"a" 5
"a" 3
#MDBlocal
"arr":[{"a":1},{"a":99},{"a":5},{"a":3}]
{"$reduce":{
"input":"$arr",
"initialValue":0,
"in":{$add:["$$value","$$this.a"]}
}}
{"$reduce":{
"input":"$arr",
"intialValue":[],
"in":{"$concatArrays":[
["$$this"],
"$$value"
]}
}}
ARRAY EXPRESSIONS $reduce
"a" 1
"a" 99
"a" 5
"a" 3
108
"a" 1
"a" 99
"a" 5
"a" 3
[]
#MDBlocal
"arr":[{"a":1},{"a":99},{"a":5},{"a":3}]
{"$reduce":{
"input":"$arr",
"initialValue":0,
"in":{$add:["$$value","$$this.a"]}
}}
{"$reduce":{
"input":"$arr",
"initialValue":[],
"in":{"$concatArrays":[
["$$this"],
"$$value"
]}
}}
[]
ARRAY EXPRESSIONS $reduce
"a" 1
"a" 99
"a" 5
"a" 3
108
"a" 1
"a" 99
"a" 5
"a" 3
"a" 1"a" 99
"a" 1
"a" 5
"a" 99
"a" 1
"a" 3
"a" 5
"a" 99
"a" 1
# M D B l o c a l
READABILITY TIP
#MDBlocal
Functions for expressions
reverseArray=function(input){
return{"$reduce":{
"input":input,
"intialValue":[],
"in":{"$concatArrays":[
["$$this"],
"$$value"
]}
}};
};
db.c.aggregate([{"$addFields":{
"revArray":reverseArray("$origArray")
}}])
ENCAPSULATE COMPLEXITY
#MDBlocal
Functions for expressions
sortArray=function(inputArray,sortField="",asc=false)
{
varsuffix="";
varmaxF=MaxKey;
varminF=MinKey;
if(sortField!=""){
suffix="."+sortField;
db.c.aggregate([{"$addFields":{
"sortedArray":sortArray("$origArray")
}}])
ENCAPSULATE COMPLEXITY
# M D B l o c a l
EXAMPLES
# M D B l o c a l
SCHEMA DISCOVERY
New Expressions (3.4.4, 3.6):
{"$objectToArray": <object>}
=> array of k/v pairs
{"$arrayToObject": <array of k/v pairs>}
=> object
$ObjectToArray:"$vid"
[
{ "k": "messageId",
"v": "bcd1d991"
},
{ "k": "date",
"v": 1486546629585
},
{ "k": "status",
"v": "accept"
},
{ "k": "comment",
"v": "hi"
}
]
$ObjectToArray:"$$ROOT"
[ {
"k":"vid",
"v": {
"messageId": "bcd1d991",
"date": 1486546629585,
"status": "accept",
"comment": "hi"
}
]
Object:
{
"vid": {
"messageId": "bcd1d9",
"date": 1486546629585,
"status": "accept",
"comment": "hi"
}
}
$project
{
"vid": "072ade7d42d8",
"msgId": "bcd1d9",
"date": 1486546629585,
"status": "accept",
"comment": "hi"
},
{
"vid": "595d0a56cff2",
"msgId": "595d0a",
"date": 1486566646197,
"status": "reject",
"comment": "no good"
},
...
{"$project": {
"fields": {
"$objectToArray": "$$ROOT"
}
}
{"fields": [
{ "k":"vid","v":"072ade7d42d8",
{ "k":"msgId", "v": "bcd1d991"},
{ "k":"date","v": 1486546629585 },
{ "k":"status", "v": "accept"},
{ "k":"comment", "v": "hi"}
] },
{"fields": [
{ "k":"vid","v":"595d0a56cff2",
{ "k":"msgId", "v": "595d0a"},
{ "k":"date","v": 1486566646197},
{ "k":"status", "v": "reject"},
{ "k":"comment", "v": "no good"}
] },
...
$project
{
"vid": "072ade7d42d8",
"msgId": "bcd1d9",
"date": 1486546629585,
"status": "accept",
"comment": "hi"
},
{
"vid": "595d0a56cff2",
"msgId": "595d0a",
"date": 1486566646197,
"status": "reject",
"comment": "no good"
},
...
{"$project": {
"fields": {
"$objectToArray": "$$ROOT"
}
} },
{"$project": {
"fields": {
"$map": {
"input":"$fields",
"in": {
"k":"$$this.k",
"t":{"$type":"$$this.v"}
}
}
}
}},
{"fields": [
{ "k":"vid","t":"string",
{ "k":"msgId", "t": "string"},
{ "k":"date","t": double},
{ "k":"status", "t": "string"},
{ "k":"comment", "t": "string"}
] },
{"fields": [
{ "k":"vid","t":"string",
{ "k":"msgId", "t": "string"},
{ "k":"date","t": "double"},
{ "k":"status", "t": "string"},
{ "k":"comment", "t": "string"}
] },
...
{"fields": [
{ "k":"vid","v":"072ade7d42d8",
{ "k":"msgId", "v": "bcd1d991"},
{ "k":"date","v": 1486546629585 },
{ "k":"status", "v": "accept"},
{ "k":"comment", "v": "hi"}
] },
{"fields": [
{ "k":"vid","v":"595d0a56cff2",
{ "k":"msgId", "v": "595d0a"},
{ "k":"date","v": 1486566646197},
{ "k":"status", "v": "reject"},
{ "k":"comment", "v": "no good"}
] },
...
$project
$project
{
"vid": "072ade7d42d8",
"msgId": "bcd1d9",
"date": 1486546629585,
"status": "accept",
"comment": "hi"
},
{
"vid": "595d0a56cff2",
"msgId": "595d0a",
"date": 1486566646197,
"status": "reject",
"comment": "no good"
},
...
{"$project": {
"fields": {
"$map": {
"input":{
"$objectToArray":"$$ROOT"},
"in": {
"k":"$$this.k",
"t":{"$type":"$$this.v"}
}
}
}
}},
{"fields": [
{ "k":"vid","t":"string",
{ "k":"msgId", "t": "string"},
{ "k":"date","t": double},
{ "k":"status", "t": "string"},
{ "k":"comment", "t": "string"}
] },
{"fields": [
{ "k":"vid","t":"string",
{ "k":"msgId", "t": "string"},
{ "k":"date","t": "double"},
{ "k":"status", "t": "string"},
{ "k":"comment", "t": "string"}
] },
...
$project
$project
{
"vid": "072ade7d42d8",
"msgId": "bcd1d9",
"date": 1486546629585,
"status": "accept",
"comment": "hi"
},
{
"vid": "595d0a56cff2",
"msgId": "595d0a",
"date": 1486566646197,
"status": "reject",
"comment": "no good"
},
...
{"$project": {
"fields": {
"$map": {
"input":{
"$objectToArray":"$$ROOT"},
"in": {
"k":"$$this.k",
"t":{"$type":"$$this.v"}
}
}
}
}},
{"$unwind" : "$fields"}
{"fields": [
{ "k":"vid","t":"string",
{ "k":"msgId", "t": "string"},
{ "k":"date","t": double},
{ "k":"status", "t": "string"},
{ "k":"comment", "t": "string"}
] },
{"fields": [
{ "k":"vid","t":"string",
{ "k":"msgId", "t": "string"},
{ "k":"date","t": "double"},
{ "k":"status", "t": "string"},
{ "k":"comment", "t": "string"}
] },
...
{"fields":{"k":"vid","t":"string",
{"fields":{"k":"msgId", "t": "string"},
{"fields":{"k":"date","t": double},
{"fields":{"k":"status", "t": "string"},
{"fields":{"k":"comment", "t": "string"},
{"fields":{"k":"vid","t":"string",
{"fields":{"k":"msgId", "t": "string"},
{"fields":{"k":"date","t": double},
{"fields":{"k":"status", "t": "string"},
{"fields":{"k":"comment", "t": "string"}
...
$unwind
$project
{
"vid": "072ade7d42d8",
"msgId": "bcd1d9",
"date": 1486546629585,
"status": "accept",
"comment": "hi"
},
{
"vid": "595d0a56cff2",
"msgId": "595d0a",
"date": 1486566646197,
"status": "reject",
"comment": "no good"
},
...
{"$project": {
"fields": {
"$map": {
"input":{
"$objectToArray":"$$ROOT"},
"in": {
"k":"$$this.k",
"t":{"$type":"$$this.v"}
}
}
}
}},
{"$unwind" : "$fields"},
{"$group" : {
"_id" : "$fields.k",
"types" : {
"$addToSet":"$fields.t"
}
}
}
{"fields":{"k":"vid","t":"string",
{"fields":{"k":"msgId", "t": "string"},
{"fields":{"k":"date","t": double},
{"fields":{"k":"status", "t": "string"},
{"fields":{"k":"comment", "t": "string"},
{"fields":{"k":"vid","t":"string",
{"fields":{"k":"msgId", "t": "string"},
{"fields":{"k":"date","t": double},
{"fields":{"k":"status", "t": "string"},
{"fields":{"k":"comment", "t": "string"}
...
$unwind $group
{ "_id": "comment", "types": ["string"]},
{ "_id": "status", "types": ["string"]},
{ "_id": "date", "types": ["double"]},
{ "_id": "msgId", "types": ["string"]},
{ "_id": "vid", "types": ["string"]},
...
$project
{
"vid": "072ade7d42d8",
"msgId": "bcd1d9",
"date": 1486546629585,
"status": "accept",
"comment": "hi"
},
{
"vid": "595d0a56cff2",
"msgId": "595d0a",
"date": 1486566646197,
"status": "reject",
"comment": "no good"
},
...
{"$project": {
"fields": {
"$map": {
"input":{
"$objectToArray":"$$ROOT"},
"in": {
"k":"$$this.k",
"t":{"$type":"$$this.v"}
}
}
}
}},
{"$unwind" : "$fields"},
{"$group" : {
"_id" : {
"k":"$fields.k",
"t":"$fields.t"
},
"c":{"$sum":1}
} }
{"fields": [
{ "k":"vid","t":"string",
{ "k":"msgId", "t": "string"},
{ "k":"date","t": double},
{ "k":"status", "t": "string"},
{ "k":"comment", "t": "string"}
] },
{"fields": [
{ "k":"vid","t":"string",
{ "k":"msgId", "t": "string"},
{ "k":"date","t": "double"},
{ "k":"status", "t": "string"},
{ "k":"comment", "t": "string"}
] },
...
{"fields":{"k":"vid","t":"string",
{"fields":{"k":"msgId", "t": "string"},
{"fields":{"k":"date","t": double},
{"fields":{"k":"status", "t": "string"},
{"fields":{"k":"comment", "t": "string"},
{"fields":{"k":"vid","t":"string",
{"fields":{"k":"msgId", "t": "string"},
{"fields":{"k":"date","t": double},
{"fields":{"k":"status", "t": "string"},
{"fields":{"k":"comment", "t": "string"}
...
$unwind
{"_id":{"k":"status","t":"string"},
"c":100
},
{"_id":{"k":"comment","t":"string" },
"c":100
},
{"_id":{"k":"date","t":"double" },
"c":100
},
{"_id":{"k":"msgId","t":"string"},
"c":100
},
{"_id":{"k":"vid","t":"string"},
"c":100
}
...
$group
# M D B l o c a l
SCHEMA TRANSFORMATION
{"body": {
"VMESSAGE": {
"072ade7d42d8": {
"msgId": "bcd1d9",
"date":1486546629585,
"status": "accept",
"comment": "hi"
} } } },
{"body": {
"VMESSAGE": {
"595d0a56cff2": {
"msgId": "595d0a",
"date":1486566646197,
"status": "reject",
"comment": "no good"
} } } },
{ "body": {
"VMESSAGE": {
"52ffd09bf5b5": {
"msgId": "1dadce",
"date":1486568943752,
"status": "accept"
} } } }
{"message": {
"vid": "072ade7d42d8",
"msgId": "bcd1d9",
"date": 1486546629585,
"status": "accept",
"comment": "hi"
} },
{"message": {
"vid": "595d0a56cff2",
"msgId": "595d0a",
"date": 1486566646197,
"status": "reject",
"comment": "no good"
} },
{"message": {
"vid": "52ffd09bf5b5",
"msgId": "1dadce",
"date": 1486568943752,
"status": "accept"
} }
{"$addFields":{
"message":{
"$let":{
"vars":{
"elem": {"$arrayElemAt:[
{"$objectToArray":"$body.VMESSAGE"},
0
]}
},
"in":{"$mergeObjects":[
{"vid": "$$elem.k" },
"$$elem.v"
]}
}
}
}}
{"body": {
"VMESSAGE": {
"072ade7d42d8": {
"msgId": "bcd1d9",
"date":1486546629585,
"status": "accept",
"comment": "hi"
} } } },
{"body": {
"VMESSAGE": {
"595d0a56cff2": {
"msgId": "595d0a",
"date":1486566646197,
"status": "reject",
"comment": "no good"
} } } },
{ "body": {
"VMESSAGE": {
"52ffd09bf5b5": {
"msgId": "1dadce",
"date":1486568943752,
"status": "accept"
} } } }
{"message": {
"vid": "072ade7d42d8",
"msgId": "bcd1d9",
"date": 1486546629585,
"status": "accept",
"comment": "hi"
} },
{"message": {
"vid": "595d0a56cff2",
"msgId": "595d0a",
"date": 1486566646197,
"status": "reject",
"comment": "no good"
} },
{"message": {
"vid": "52ffd09bf5b5",
"msgId": "1dadce",
"date": 1486568943752,
"status": "accept"
} }
# M D B l o c a l
AGGREGATION
FIND QUERY
UPDATE QUERY
DOCUMENT VALIDATION
EXPRESSIONS
{children:[
{name:"Max",dob:"1994-12-01",dep:true},
{name:"Sam",dob:"1997-09-28",dep:true},
{name:"Kim",dob:"2000-02-29",dep:true}
]}
# M D B l o c a l
AGGREGATION
FIND QUERY
UPDATE QUERY
DOCUMENT VALIDATION
{children:[
{name:"Max",dob:"1994-12-01",dep:false},
{name:"Sam",dob:"1997-09-28",dep:true},
{name:"Kim",dob:"2000-02-29",dep:true}
]}
db.c.aggregate([
{$addFields:{
numChildren:{$size:"$children"},
numDependents:{$size:{
$filter:{
input:"$children.dep",
cond:"$$this"
}
}}
}},
...
])
EXPRESSIONS
# M D B l o c a l
AGGREGATION
FIND QUERY
UPDATE QUERY
DOCUMENT VALIDATION
{children:[
{name:"Max",dob:"1994-12-01",dep:false},
{name:"Sam",dob:"1997-09-28",dep:true},
{name:"Kim",dob:"2000-02-29",dep:true}
]}
db.c.find({$expr:{$gt:["$a","$b"]}})
NEW IN 3.6
EXPRESSIONS
# M D B l o c a l
AGGREGATION
FIND QUERY
UPDATE QUERY
DOCUMENT VALIDATION
EXPRESSIONS
{children:[
{name:"Max",dob:"1994-12-01",dep:false},
{name:"Sam",dob:"1997-09-28",dep:true},
{name:"Kim",dob:"2000-02-29",dep:true}
]}
db.c.find({$expr:{
$lt:[{$size:{$filter:{
input:"$children.dep",
cond:"$$this"
}}},
2
]
}})
NEW IN 3.6
# M D B l o c a l
AGGREGATION
FIND QUERY
UPDATE QUERY
DOCUMENT VALIDATION
EXPRESSIONS
{children:[
{name:"Max",dob:"1994-12-01",dep:false},
{name:"Sam",dob:"1997-09-28",dep:true},
{name:"Kim",dob:"2000-02-29",dep:true}
]}
db.c.find({$expr:{$gt:[
{$let:{
vars:{dobs:{$map:{
input:"$children.dob"
in:{$year:{$dateFromString:{
dateString:"$$this"
}}}}}},
in:{$subtract:[
{$max:"$$dobs"},
{$min:"$$dobs"}
]}}},
10
]}})
NEW IN 3.6
# M D B l o c a l
AGGREGATION
FIND QUERY
UPDATE QUERY
DOCUMENT VALIDATION
EXPRESSIONS
{children:[
{name:"Max",dob:"1994-12-01",dep:false},
{name:"Sam",dob:"1997-09-28",dep:true},
{name:"Kim",dob:"2000-02-29",dep:true}
]}
db.c.update({$expr:{$anyElementTrue:{$map:{
input:"$children",
in:{$and:[
{$lt:["$$this.dob","1997-04-24"]},
"$$this.dep"
]}
}}}},
{$set:{audit:true}}
)
NEW IN 3.6
# M D B l o c a l
AGGREGATION
FIND QUERY
UPDATE QUERY
DOCUMENT VALIDATION
EXPRESSIONS
{children:[
{name:"Max",dob:"1994-12-01",dep:false},
{name:"Sam",dob:"1997-09-28",dep:true},
{name:"Kim",dob:"2000-02-29",dep:true}
]}
db.createCollection("c",validator:
{$expr:{
<anythingyoucanexpress>
}})
NEW IN 3.6
# M D B l o c a l
See you again after the break!
Coming Up Next:
Aggregation Performance
Aggregation in Sharding
and A use case
#MDBlocal
PIPELINE POWER
DOING MORE WITH MONGODB AGGREGATION
Ankur Raina MongoDB Inc @rainaankur92
# M D B l o c a l
Can you EXPLAIN ?
db.books.aggregate([
{$match:{"language":"English"}},
{$unwind:"$subjects"},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3}
],{explain:true})
{"stages" : [
{"$cursor" : {"query" : { "language" : "English"},
"fields" : { "subjects" : 1,"_id" : 0} ...
}},
{"$unwind" : {"path" : "$subjects"}},
{"$group" : {"_id" : "$subjects","count" : {"$sum" : {"$const" : 1}} }},
{"$sort" : {
"sortKey" : {"count" : -1},
"limit" : NumberLong(3)
}}
] }
db.books.aggregate([
{$match:{"language":"English"}},
{$unwind:"$subjects"},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3}
],{explain:true})
{"stages" : [
{"$cursor" : {"query" : { "language" : "English"},
"fields" : { "subjects" : 1,"_id" : 0} ...
}},
{"$unwind" : {"path" : "$subjects"}},
{"$group" : {"_id" : "$subjects","count" : {"$sum" : {"$const" : 1}} }},
{"$sort" : {
"sortKey" : {"count" : -1},
"limit" : NumberLong(3)
}}
] }
db.books.aggregate([
{$match:{"language":"English"}},
{$unwind:"$subjects"},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3}
],{explain:true})
{"stages" : [
{"$cursor" : {"query" : { },
"fields" : { "subjects" : 1,"_id" : 0} ...
}},
{"$unwind" : {"path" : "$subjects"}},
{"$group" : {"_id" : "$subjects","count" : {"$sum" : {"$const" : 1}} }},
{"$sort" : {
"sortKey" : {"count" : -1},
"limit" : NumberLong(3)
}}
] }
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English"}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3}
],{explain:true})
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English"}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3}
],{explain:true})
{"stages" : [
{"$cursor" : {"query" : { "language" : "English"},
"fields" : { "subjects" : 1,"_id" : 0} ...
}},
{"$unwind" : {"path" : "$subjects"}},
{"$group" : {"_id" : "$subjects","count" : {"$sum" : {"$const" : 1}} }},
{"$sort" : {
"sortKey" : {"count" : -1},
"limit" : NumberLong(3)
}}
] }
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3}
],{explain:true})
{"stages" : [
{"$cursor" : {"query" : { "language" : "English"},
"fields" : { "subjects" : 1,"_id" : 0} ...
}},
{"$unwind" : {"path" : "$subjects"}},
{"$match" : {"subjects" : {"$regex" : "^[ABC]"}}},
{"$group" : {"_id" : "$subjects","count" : {"$sum" : {"$const" : 1}}}},
{"$sort" : {
"sortKey" : {"count" : -1},
"limit" : NumberLong(3)
}}
] }
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3}
],{explain:true})
{"stages" : [
{"$cursor" : {"query" : { "language" : "English"},
"fields" : { "subjects" : 1,"_id" : 0} ...
}},
{"$unwind" : {"path" : "$subjects"}},
{"$match" : {"subjects" : {"$regex" : "^[ABC]"}}},
{"$group" : {"_id" : "$subjects","count" : {"$sum" : {"$const" : 1}}}},
{"$sort" : {
"sortKey" : {"count" : -1},
"limit" : NumberLong(3)
}}
] }
# M D B l o c a l
NETWORK SUSPECT
ACTIVITY DETECTION
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T05:28:13Z")
}
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}}}},
$sort$match $group
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
{ _id: "303900",
ips: [
{ip:"71.56.112.56",
ts:ISODate("2017-05-08T08:54:04Z")
},
{ip:"71.56.112.56",
ts:ISODate("2017-05-09T09:01:11Z")
},
{ip:"12.130.117.87",
ts:ISODate("2017-05-09T09:04:59Z")
}
]}
$sort$match $group $addFields $match
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
$project
{_id:"303900",
ips:[
{ip:"71.56.112.56",
ts:ISODate("2017-05-08T...")
},
{ip:"71.56.112.56",
ts:ISODate("2017-05-09T...")
},
{ip:"12.130.117.87",
ts:ISODate("2017-05-09T...")
}
]}
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$and:[{$lt:["$$this.diff",10]},{$ne:["$$this.ip1","$$this.ip2"]}]}
}}}},
$sort$match $group $addFields $match
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
$project
{_id:"303900",
ips:[
{ip:"71.56.112.56",
ts:ISODate("2017-05-08T...")
},
{ip:"71.56.112.56",
ts:ISODate("2017-05-09T...")
},
{ip:"12.130.117.87",
ts:ISODate("2017-05-09T...")
}
]}
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$and:[{$lt:["$$this.diff",10]},{$ne:["$$this.ip1","$$this.ip2"]}]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
$sort$match $group $addFields $match
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
$project
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$and:[{$lt:["$$this.diff",10]},{$ne:["$$this.ip1","$$this.ip2"]}]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
{"user":"35237073",
"suspectLogins":[
{"diff":4.8333333333,
"ip1":"106.220.151.16",
"t1":"2017-05-08T06:58",
"ip2":"223.182.113.15"
"t2":"2017-05-08T07:03"
},
{"diff":8.3,
"ip1":"223.182.113.15",
"t1":"2017-05-08T07:03",
"ip2":"49.206.217.26",
"t2":"2017-05-08T07:11"
}
]
}
$sort$match $group $addFields $match $project
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$and:[{$lt:["$$this.diff",10]},{$ne:["$$this.ip1","$$this.ip2"]}]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
{_id:"303900",
ips:[
{ip:"71.56.112.56",
ts:ISODate("2017-05-08T...")
},
{ip:"71.56.112.56",
ts:ISODate("2017-05-09T...")
},
{ip:"12.130.117.87",
ts:ISODate("2017-05-09T...")
}
]}
$sort$match $group $addFields $match
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
$addFields $match $proj
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}}}},
{$addFields:{diffIpNum:{$size:{$setUnion:"$ips.ip"}}}},
{$match:{diffIpNum:{$gt:1}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$and:[{$lt:["$$this.diff",10]},{$ne:["$$this.ip1","$$this.ip2"]}]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
{_id:"303900",
ips:[
{ip:"71.56.112.56",
ts:ISODate("2017-05-08T...")
},
{ip:"71.56.112.56",
ts:ISODate("2017-05-09T...")
},
{ip:"12.130.117.87",
ts:ISODate("2017-05-09T...")
}
]}
$sort$match $group $match
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
$addFields $match $project
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}},
diffIps:{$addToSet:"$ipaddr"}}},
{$match:{$expr:{$gt:[{$size:"$diffIps"},1]}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$and:[{$lt:["$$this.diff",10]},{$ne:["$$this.ip1","$$this.ip2"]}]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
{_id:"303900",
ips:[
{ip:"71.56.112.56",
ts:ISODate("2017-05-08T...")
},
{ip:"71.56.112.56",
ts:ISODate("2017-05-09T...")
},
{ip:"12.130.117.87",
ts:ISODate("2017-05-09T...")
},
diffIps:[
"71.56.112.56",
"12.130.117.87"
]
]}
$sort$match $group $match
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
$addFields $match $project
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}},
diffIps:{$addToSet:"$ipaddr"}}},
{$match:{"diffIps.1":{$exists:true}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$and:[{$lt:["$$this.diff",10]},{$ne:["$$this.ip1","$$this.ip2"]}]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
{_id:"303900",
ips:[
{ip:"71.56.112.56",
ts:ISODate("2017-05-08T...")
},
{ip:"71.56.112.56",
ts:ISODate("2017-05-09T...")
},
{ip:"12.130.117.87",
ts:ISODate("2017-05-09T...")
},
diffIps:[
"71.56.112.56",
"12.130.117.87"
]
]}
$sort$match $group
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}},
diffIps:{$addToSet:"$ipaddr"}}},
{$match:{"diffIps.1":{$exists:true}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$and:[{$lt:["$$this.diff",10]},{$ne:["$$this.ip1","$$this.ip2"]}]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
$match $addFields $match $project
{_id:"303900",
ips:[
{ip:"71.56.112.56",
ts:ISODate("2017-05-08T...")
},
{ip:"71.56.112.56",
ts:ISODate("2017-05-09T...")
},
{ip:"12.130.117.87",
ts:ISODate("2017-05-09T...")
},
diffIps:[
"71.56.112.56",
"12.130.117.87"
]
]}
$sort$match $group
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}},
diffIps:{$addToSet:"$ipaddr"}}},
{$match:{"diffIps.1":{$exists:true}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$cond:{
}},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$and:[{$lt:["$$this.diff",10]},{$ne:["$$this.ip1","$$this.ip2"]}]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
$match $addFields $match $project
{_id:"303900",
ips:[
{ip:"71.56.112.56",
ts:ISODate("2017-05-08T...")
},
{ip:"71.56.112.56",
ts:ISODate("2017-05-09T...")
},
{ip:"12.130.117.87",
ts:ISODate("2017-05-09T...")
},
diffIps:[
"71.56.112.56",
"12.130.117.87"
]
]}
$sort$match $group
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}},
diffIps:{$addToSet:"$ipaddr"}}},
{$match:{"diffIps.1":{$exists:true}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$cond:{
if:{$ne:["$$ip1.ip","$$ip2.ip"]},
then:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
else: 9999 }},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$and:[{$lt:["$$this.diff",10]},{$ne:["$$this.ip1","$$this.ip2"]}]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
$match $addFields $match $project
{_id:"303900",
ips:[
{ip:"71.56.112.56",
ts:ISODate("2017-05-08T...")
},
{ip:"71.56.112.56",
ts:ISODate("2017-05-09T...")
},
{ip:"12.130.117.87",
ts:ISODate("2017-05-09T...")
},
diffIps:[
"71.56.112.56",
"12.130.117.87"
]
]}
$sort$match $group
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}},
diffIps:{$addToSet:"$ipaddr"}}},
{$match:{"diffIps.1":{$exists:true}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$cond:{
if:{$ne:["$$ip1.ip","$$ip2.ip"]},
then:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
else: 9999 }},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$and:[{$lt:["$$this.diff",10]},{$ne:["$$this.ip1","$$this.ip2"]}]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
$match $addFields $match $project
{_id:"303900",
ips:[
{ip:"71.56.112.56",
ts:ISODate("2017-05-08T...")
},
{ip:"71.56.112.56",
ts:ISODate("2017-05-09T...")
},
{ip:"12.130.117.87",
ts:ISODate("2017-05-09T...")
},
diffIps:[
"71.56.112.56",
"12.130.117.87"
]
]}
$sort$match $group
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}},
diffIps:{$addToSet:"$ipaddr"}}},
{$match:{"diffIps.1":{$exists:true}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$cond:{
if:{$ne:["$$ip1.ip","$$ip2.ip"]},
then:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
else: 9999 }},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$lt:["$$this.diff",10]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
{"user":"35237073",
"suspectLogins":[
{"diff":4.8333333333,
"ip1":"106.220.151.16",
"t1":"2017-05-08T06:58",
"ip2":"223.182.113.15"
"t2":"2017-05-08T07:03"
},
{"diff":8.3,
"ip1":"223.182.113.15",
"t1":"2017-05-08T07:03",
"ip2":"49.206.217.26",
"t2":"2017-05-08T07:11"
}
]
} $match $addFields $match $project
$sort$match $group
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}},
diffIps:{$addToSet:"$ipaddr"}}},
{$match:{"diffIps.1":{$exists:true}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$cond:{
if:{$ne:["$$ip1.ip","$$ip2.ip"]},
then:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
else: 9999 }},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$lt:["$$this.diff",10]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
{"user":"35237073",
"suspectLogins":[
{"diff":4.8333333333,
"ip1":"106.220.151.16",
"t1":"2017-05-08T06:58",
"ip2":"223.182.113.15"
"t2":"2017-05-08T07:03"
},
{"diff":8.3,
"ip1":"223.182.113.15",
"t1":"2017-05-08T07:03",
"ip2":"49.206.217.26",
"t2":"2017-05-08T07:11"
}
]
} $match $addFields $match $project
$sort$match $group
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}},
diffIps:{$addToSet:"$ipaddr"}}},
{$match:{"diffIps.1":{$exists:true}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$cond:{
if:{$ne:["$$ip1.ip","$$ip2.ip"]},
then:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
else: 9999 }},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$lt:["$$this.diff",10]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
{"user":"35237073",
"suspectLogins":[
{"diff":4.8333333333,
"ip1":"106.220.151.16",
"t1":"2017-05-08T06:58",
"ip2":"223.182.113.15"
"t2":"2017-05-08T07:03"
},
{"diff":8.3,
"ip1":"223.182.113.15",
"t1":"2017-05-08T07:03",
"ip2":"49.206.217.26",
"t2":"2017-05-08T07:11"
}
]
} $match $addFields $match $project
$sort$match $group
start=ISODate("...")
end=ISODate("...")
{
user: "303900",
ipaddr: "71.56.112.56",
ts:ISODate("2017-05-08T...")
}
{$match:{ts:{$gte:start,$lt:end}}},
{$sort:{ts:1}},
{$group:{_id:"$user",ips:{$push:{ip:"$ipaddr", ts:"$ts"}},
diffIps:{$addToSet:"$ipaddr"}}},
{$match:{"diffIps.1":{$exists:true}}},
{$addFields:{diffs: {$filter:{
input:{$map:{
input: {$range:[0,{$subtract:[{$size:"$ips"},1]}]}, as:"i",
in:{$let:{vars:{ip1:{$arrayElemAt:["$ips","$$i"]},
ip2:{$arrayElemAt:["$ips",{$add:["$$i",1]}]}},
in:{
diff:{$cond:{
if:{$ne:["$$ip1.ip","$$ip2.ip"]},
then:{$divide:[{$subtract:["$$ip2.ts","$$ip1.ts"]},60000]},
else: 9999 }},
ip1:"$$ip1.ip", t1:"$$ip1.ts",
ip2:"$$ip2.ip", t2:"$$ip2.ts"
}}}}},
cond:{$lt:["$$this.diff",10]}
}}}},
{$match:{"diffs":{$ne:[]}}},
{$project:{_id:0, user:"$_id", suspectLogins:"$diffs"}}
{"user":"35237073",
"suspectLogins":[
{"diff":4.8333333333,
"ip1":"106.220.151.16",
"t1":"2017-05-08T06:58",
"ip2":"223.182.113.15"
"t2":"2017-05-08T07:03"
},
{"diff":8.3,
"ip1":"223.182.113.15",
"t1":"2017-05-08T07:03",
"ip2":"49.206.217.26",
"t2":"2017-05-08T07:11"
}
]
} $match $addFields $match $project
# M D B l o c a l
streaming vs blocking
SHARDING & MERGING
SHARDING
SHARDING
SHARDING
SHARDING
SHARDING
SHARDING
SHARDING AGGREGATION
SHARDING AGGREGATION
SHARDING AGGREGATION
SHARDING AGGREGATION
SHARDING AGGREGATION
#MDBlocal
SHARDING AGGREGATION
Work starts on individual shards
only "targeted" shards
"Merging" for first "blocking" stage is split into two parts
shards part (each shard starts the merging work)
merge part (merging finishes at "merge" location)
Final merge can happen on primary shard, any shard or mongos
on mongos (starting in 3.6 only)
Merging with only streaming stages happens on 'mongos' same as "find"
# M D B l o c a l
I CAN EXPLAIN!
I CAN EXPLAIN
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline:
shards:
}
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline:
shards:
}
"primaryShard"
"anyShard"
"mongos"
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType: "mongos",
splitPipeline:
shards:
}
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true, allowDiskUse: true })
{
mergeType: "anyShard",
splitPipeline:
shards:
}
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3}, {$out: "output"} ], {explain:true})
{
mergeType: "primaryShard",
splitPipeline:
shards:
}
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline:
shards:
}
{ "shardsPart" : [
],
"mergerPart" : [
] },
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline:
shards:
}
{ "shardsPart" : [
{"$match" :{"language": {"$eq":"English"}}},
{"$unwind":{"path": "$subjects"}},
{"$match" :{"subjects": {"$regex":"^[ABC]"}}},
{"$group" :{"_id":"$subjects","count":{"$sum":1}}}
],
"mergerPart" : [
] },
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline:
shards:
}
{ "shardsPart" : [
{"$match" :{"language": {"$eq":"English"}}},
{"$unwind":{"path": "$subjects"}},
{"$match" :{"subjects": {"$regex":"^[ABC]"}}},
{"$group" :{"_id":"$subjects","count":{"$sum":1}}}
],
"mergerPart" : [
{"$group":{
"_id":"$$ROOT._id",
"count":{"$sum":"$$ROOT.count"},
"$doingMerge" : true}},
{"$sort":{
"sortKey":{"count" : -1},
"limit":NumberLong(3)}}
] },
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline:
shards:
}
{ "shardsPart" : [
{"$match" :{"language": {"$eq":"English"}}},
{"$unwind":{"path": "$subjects"}},
{"$match" :{"subjects": {"$regex":"^[ABC]"}}},
{"$group" :{"_id":"$subjects","count":{"$sum":1}}}
],
"mergerPart" : [
{"$group":{
"_id":"$$ROOT._id",
"count":{"$sum":"$$ROOT.count"},
"$doingMerge" : true}},
{"$sort":{
"sortKey":{"count" : -1},
"limit":NumberLong(3)}}
] },
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline:
shards:
}
{ "shard0000" : {
},
"shard0001" : {
}
}
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline:
shards: { "shard0000" : {
"host": <hostname>,
"stages": [ ]
},
"shard0001" : {
"host": <hostname>,
"stages": [ ]
}
}
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline:
shards: { "shard0000" : {
"host": <hostname>,
"stages": [
{"$cursor": {
"query":{"language":{"$eq":"English"}},
"fields":{"subjects":1,"_id":0},
"queryPlanner":{"plannerVersion":1,"namespace":"test.books", ...
},
{"$unwind":{"path":"$subjects"}},
{"$match":{"subjects":{"$regex":"^[ABC]"}}},
{"$group":{"_id":"$subjects","count":{"$sum":1}}}
]
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline:
shards: { "shard0000" : {
"host": <hostname>,
"stages": [
{"$cursor": {
"query":{"language":{"$eq":"English"}},
"fields":{"subjects":1,"_id":0},
"queryPlanner":{"plannerVersion":1,"namespace":"test.books",
"winningPlan":{
"stage":"SHARDING_FILTER",
"inputStage":{ "stage":"FETCH",
"inputStage":{"stage":"IXSCAN",
"keyPattern":{"language":1,"subjects":1},
"indexName":"language_1_subjects_1","isMultiKey":false, ...
} } } }
} },
{"$unwind":{"path":"$subjects"}},
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline:
shards:
}
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline:
shards: {
"shard0000" : {
...
}
}
}
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
mergeType:
splitPipeline: null,
shards: {
"shard0000" : {
...
}
}
}
db.books.aggregate([
{$unwind:"$subjects"},
{$match:{"language":"English","subjects":/^[ABC]/}},
{$group:{_id:"$subjects",count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:3} ], {explain:true})
{
splitPipeline: null,
shards: {
"shard0000" : {
...
}
}
}
db.orders.explain().aggregate( [
{$match:{status:"F"}},
{$sort:{totalprice:-1}},
{$limit:40},
{$group:{_id:1,avgprice:{$avg:"$totalprice"}}}])
db.orders.explain().aggregate( [
{$match:{status:"F"}},
{$sort:{totalprice:-1}},
{$limit:40},
{$group:{_id:1,avgprice:{$avg:"$totalprice"}}}])
{"stages" : [
{"$cursor" : { "query" : { "status" : "F"},
"sort" : {"totalprice" : -1},
"limit" : NumberLong(40),
"fields" : { "totalprice" : 1, "_id" : 0},
"queryPlanner" : {
"winningPlan" : {
"stage" : "PROJECTION",
"transformBy" : {"totalprice" : 1, "_id" : 0},
"inputStage" : {
"stage" : "IXSCAN",
"indexName" : "status_1_totalprice_1",
"direction" : "backward",
"indexBounds" : {
"status" : [ "["F", "F"]"],
"totalprice" : ["[MaxKey, MinKey]"]
} } } },
} },
{"$group" : {"_id" : 1, "avgprice" : {"$avg" : "$totalprice"} } }
] }
db.orders.explain("executionStats").aggregate( [
{$match:{status:"F"}},
{$sort:{totalprice:-1}},
{$limit:40},
{$group:{_id:1,avgprice:{$avg:"$totalprice"}}}])
{"stages" : [
{"$cursor" : { "query" : { "status" : "F"},
"sort" : {"totalprice" : -1},
"limit" : NumberLong(40),
"fields" : { "totalprice" : 1, "_id" : 0},
"queryPlanner" : {
"winningPlan" : {
"stage" : "PROJECTION",
"transformBy" : {"totalprice" : 1, "_id" : 0},
"inputStage" : {
"stage" : "IXSCAN",
"indexName" : "status_1_totalprice_1",
"direction" : "backward",
"indexBounds" : {
"status" : [ "["F", "F"]"],
"totalprice" : ["[MaxKey, MinKey]"]
} } } },
} },
{"$group" : {"_id" : 1, "avgprice" : {"$avg" : "$totalprice"} } }
] }
db.orders.explain("executionStats").aggregate( [
{$match:{status:"F"}},
{$sort:{totalprice:-1}},
{$limit:40},
{$group:{_id:1,avgprice:{$avg:"$totalprice"}}}])
{"stages" : [
{"$cursor" : { "query" : { "status" : "F"},
"sort" : {"totalprice" : -1},
"limit" : NumberLong(40),
"fields" : { "totalprice" : 1, "_id" : 0},
"queryPlanner" : {
"winningPlan" : {
"stage" : "PROJECTION",
"transformBy" : {"totalprice" : 1, "_id" : 0},
"inputStage" : {
"stage" : "IXSCAN",
"indexName" : "status_1_totalprice_1",
"direction" : "backward",
"indexBounds" : {
"status" : [ "["F", "F"]"],
"totalprice" : ["[MaxKey, MinKey]"]
} } } },
} },
{"$group" : {"_id" : 1, "avgprice" : {"$avg" : "$totalprice"} } }
db.orders.explain("executionStats").aggregate( [
{$match:{status:"F"}},
{$sort:{totalprice:-1}},
{$limit:40},
{$group:{_id:1,avgprice:{$avg:"$totalprice"}}}])
{"stages" : [
{"$cursor" : { "query" : { "status" : "F"},
"sort" : {"totalprice" : -1},
"limit" : NumberLong(40),
"fields" : { "totalprice" : 1, "_id" : 0},
"queryPlanner" : {
"winningPlan" : {
"stage" : "PROJECTION",
"transformBy" : {"totalprice" : 1, "_id" : 0},
"inputStage" : {
"stage" : "IXSCAN",
"indexName" : "status_1_totalprice_1",
"direction" : "backward",
"indexBounds" : {
"status" : [ "["F", "F"]"],
"totalprice" : ["[MaxKey, MinKey]"]
} } } },
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 85,
"executionTimeMillis" : 3,
"totalKeysExamined" : 30295,
"totalDocsExamined" : 0,
"executionStages" : { ... }
} } },
{"$group" : {"_id" : 1, "avgprice" : {"$avg" : "$totalprice"} } }
#MDBlocal
NEW IN 3.6
executionStats option to explain
"hint" for aggregation
db.orders.explain().aggregate( [
{$match:{status:"F"}},
{$sort:{totalprice:-1}},
{$limit:40},
{$group:{_id:1,avgprice:{$avg:"$totalprice"}}}
], {"hint":{"status":1, "totalprice":1}})
#MDBlocal# M D B l o c a l
understand stages
• Best order for performance
• Avoid unnecessary "blocking"
• keep "streaming"
• Maximize use of indexes
• early stages get the index!
• Liberally check explain() output
understand expressions
• Schema manipulation
• Array transformation
• Use in find query filter, ...
use functions
• Readable, debug-able, reusable
POWERFUL AGGREGATIONS
#MDBlocal# M D B l o c a l
Better performance & optimizations
More stages & expressions
More options for output
Compass helper for aggregate
Unify different languages
THE FUTURE OF AGGREGATION
[MongoDB.local Bengaluru 2018] Tutorial: Pipeline Power - Doing More with MongoDB Aggregation

More Related Content

What's hot

Template Haskell Tutorial
Template Haskell TutorialTemplate Haskell Tutorial
Template Haskell Tutorialkizzx2
 
Functional Pe(a)rls version 2
Functional Pe(a)rls version 2Functional Pe(a)rls version 2
Functional Pe(a)rls version 2osfameron
 
Using R for Building a Simple and Effective Dashboard
Using R for Building a Simple and Effective DashboardUsing R for Building a Simple and Effective Dashboard
Using R for Building a Simple and Effective DashboardAndrea Gigli
 
Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...
Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...
Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...takeoutweight
 
Wx::Perl::Smart
Wx::Perl::SmartWx::Perl::Smart
Wx::Perl::Smartlichtkind
 
CSS for Developers
CSS for DevelopersCSS for Developers
CSS for DevelopersNascenia IT
 
Functional pe(a)rls: Huey's zipper
Functional pe(a)rls: Huey's zipperFunctional pe(a)rls: Huey's zipper
Functional pe(a)rls: Huey's zipperosfameron
 
Functional Pe(a)rls - the Purely Functional Datastructures edition
Functional Pe(a)rls - the Purely Functional Datastructures editionFunctional Pe(a)rls - the Purely Functional Datastructures edition
Functional Pe(a)rls - the Purely Functional Datastructures editionosfameron
 
Coding Horrors
Coding HorrorsCoding Horrors
Coding HorrorsMark Baker
 
The Perl6 Type System
The Perl6 Type SystemThe Perl6 Type System
The Perl6 Type Systemabrummett
 
Perl training-in-navi mumbai
Perl training-in-navi mumbaiPerl training-in-navi mumbai
Perl training-in-navi mumbaivibrantuser
 
CLI, the other SAPI phpnw11
CLI, the other SAPI phpnw11CLI, the other SAPI phpnw11
CLI, the other SAPI phpnw11Combell NV
 
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27Ruby Meditation
 
The Ring programming language version 1.7 book - Part 49 of 196
The Ring programming language version 1.7 book - Part 49 of 196The Ring programming language version 1.7 book - Part 49 of 196
The Ring programming language version 1.7 book - Part 49 of 196Mahmoud Samir Fayed
 
Using a mobile phone as a therapist - Superweek 2018
Using a mobile phone as a therapist - Superweek 2018Using a mobile phone as a therapist - Superweek 2018
Using a mobile phone as a therapist - Superweek 2018Peter Meyer
 
Avro, la puissance du binaire, la souplesse du JSON
Avro, la puissance du binaire, la souplesse du JSONAvro, la puissance du binaire, la souplesse du JSON
Avro, la puissance du binaire, la souplesse du JSONAlexandre Victoor
 

What's hot (20)

Template Haskell Tutorial
Template Haskell TutorialTemplate Haskell Tutorial
Template Haskell Tutorial
 
Functional Pe(a)rls version 2
Functional Pe(a)rls version 2Functional Pe(a)rls version 2
Functional Pe(a)rls version 2
 
Using R for Building a Simple and Effective Dashboard
Using R for Building a Simple and Effective DashboardUsing R for Building a Simple and Effective Dashboard
Using R for Building a Simple and Effective Dashboard
 
Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...
Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...
Haste (Same Language, Multiple Platforms) and Tagless Final Style (Same Synta...
 
Wx::Perl::Smart
Wx::Perl::SmartWx::Perl::Smart
Wx::Perl::Smart
 
CSS for developers
CSS for developersCSS for developers
CSS for developers
 
Elastic tire demo
Elastic tire demoElastic tire demo
Elastic tire demo
 
CSS for Developers
CSS for DevelopersCSS for Developers
CSS for Developers
 
Functional pe(a)rls: Huey's zipper
Functional pe(a)rls: Huey's zipperFunctional pe(a)rls: Huey's zipper
Functional pe(a)rls: Huey's zipper
 
Functional Pe(a)rls - the Purely Functional Datastructures edition
Functional Pe(a)rls - the Purely Functional Datastructures editionFunctional Pe(a)rls - the Purely Functional Datastructures edition
Functional Pe(a)rls - the Purely Functional Datastructures edition
 
FCIP SASS Talk
FCIP SASS TalkFCIP SASS Talk
FCIP SASS Talk
 
Coding Horrors
Coding HorrorsCoding Horrors
Coding Horrors
 
Further Php
Further PhpFurther Php
Further Php
 
The Perl6 Type System
The Perl6 Type SystemThe Perl6 Type System
The Perl6 Type System
 
Perl training-in-navi mumbai
Perl training-in-navi mumbaiPerl training-in-navi mumbai
Perl training-in-navi mumbai
 
CLI, the other SAPI phpnw11
CLI, the other SAPI phpnw11CLI, the other SAPI phpnw11
CLI, the other SAPI phpnw11
 
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
 
The Ring programming language version 1.7 book - Part 49 of 196
The Ring programming language version 1.7 book - Part 49 of 196The Ring programming language version 1.7 book - Part 49 of 196
The Ring programming language version 1.7 book - Part 49 of 196
 
Using a mobile phone as a therapist - Superweek 2018
Using a mobile phone as a therapist - Superweek 2018Using a mobile phone as a therapist - Superweek 2018
Using a mobile phone as a therapist - Superweek 2018
 
Avro, la puissance du binaire, la souplesse du JSON
Avro, la puissance du binaire, la souplesse du JSONAvro, la puissance du binaire, la souplesse du JSON
Avro, la puissance du binaire, la souplesse du JSON
 

Similar to [MongoDB.local Bengaluru 2018] Tutorial: Pipeline Power - Doing More with MongoDB Aggregation

"Powerful Analysis with the Aggregation Pipeline (Tutorial)"
"Powerful Analysis with the Aggregation Pipeline (Tutorial)""Powerful Analysis with the Aggregation Pipeline (Tutorial)"
"Powerful Analysis with the Aggregation Pipeline (Tutorial)"MongoDB
 
Powerful Analysis with the Aggregation Pipeline
Powerful Analysis with the Aggregation PipelinePowerful Analysis with the Aggregation Pipeline
Powerful Analysis with the Aggregation PipelineMongoDB
 
Doing More with MongoDB Aggregation
Doing More with MongoDB AggregationDoing More with MongoDB Aggregation
Doing More with MongoDB AggregationMongoDB
 
MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...
MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...
MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...MongoDB
 
MongoDB .local Toronto 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...
MongoDB .local Toronto 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...MongoDB .local Toronto 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...
MongoDB .local Toronto 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...MongoDB
 
MongoDB .local Chicago 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...
MongoDB .local Chicago 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...MongoDB .local Chicago 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...
MongoDB .local Chicago 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...MongoDB
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB
 
MongoDB World 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pipeline Em...
MongoDB World 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pipeline Em...MongoDB World 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pipeline Em...
MongoDB World 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pipeline Em...MongoDB
 
MongoDB .local Bengaluru 2019: Aggregation Pipeline Power++: How MongoDB 4.2 ...
MongoDB .local Bengaluru 2019: Aggregation Pipeline Power++: How MongoDB 4.2 ...MongoDB .local Bengaluru 2019: Aggregation Pipeline Power++: How MongoDB 4.2 ...
MongoDB .local Bengaluru 2019: Aggregation Pipeline Power++: How MongoDB 4.2 ...MongoDB
 
Aggregation Framework
Aggregation FrameworkAggregation Framework
Aggregation FrameworkMongoDB
 
The Aggregation Framework
The Aggregation FrameworkThe Aggregation Framework
The Aggregation FrameworkMongoDB
 
Webinar: Data Processing and Aggregation Options
Webinar: Data Processing and Aggregation OptionsWebinar: Data Processing and Aggregation Options
Webinar: Data Processing and Aggregation OptionsMongoDB
 
Max Neunhöffer – Joins and aggregations in a distributed NoSQL DB - NoSQL mat...
Max Neunhöffer – Joins and aggregations in a distributed NoSQL DB - NoSQL mat...Max Neunhöffer – Joins and aggregations in a distributed NoSQL DB - NoSQL mat...
Max Neunhöffer – Joins and aggregations in a distributed NoSQL DB - NoSQL mat...NoSQLmatters
 
Introduction to MongoDB for C# developers
Introduction to MongoDB for C# developersIntroduction to MongoDB for C# developers
Introduction to MongoDB for C# developersTaras Romanyk
 
MongoDB .local Paris 2020: La puissance du Pipeline d'Agrégation de MongoDB
MongoDB .local Paris 2020: La puissance du Pipeline d'Agrégation de MongoDBMongoDB .local Paris 2020: La puissance du Pipeline d'Agrégation de MongoDB
MongoDB .local Paris 2020: La puissance du Pipeline d'Agrégation de MongoDBMongoDB
 
MongoDB Aggregation Framework
MongoDB Aggregation FrameworkMongoDB Aggregation Framework
MongoDB Aggregation FrameworkCaserta
 
MongoDB Aggregations Indexing and Profiling
MongoDB Aggregations Indexing and ProfilingMongoDB Aggregations Indexing and Profiling
MongoDB Aggregations Indexing and ProfilingManish Kapoor
 
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6Workhorse Computing
 

Similar to [MongoDB.local Bengaluru 2018] Tutorial: Pipeline Power - Doing More with MongoDB Aggregation (20)

"Powerful Analysis with the Aggregation Pipeline (Tutorial)"
"Powerful Analysis with the Aggregation Pipeline (Tutorial)""Powerful Analysis with the Aggregation Pipeline (Tutorial)"
"Powerful Analysis with the Aggregation Pipeline (Tutorial)"
 
Powerful Analysis with the Aggregation Pipeline
Powerful Analysis with the Aggregation PipelinePowerful Analysis with the Aggregation Pipeline
Powerful Analysis with the Aggregation Pipeline
 
Doing More with MongoDB Aggregation
Doing More with MongoDB AggregationDoing More with MongoDB Aggregation
Doing More with MongoDB Aggregation
 
MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...
MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...
MongoDB .local Munich 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pip...
 
MongoDB .local Toronto 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...
MongoDB .local Toronto 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...MongoDB .local Toronto 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...
MongoDB .local Toronto 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...
 
MongoDB .local Chicago 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...
MongoDB .local Chicago 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...MongoDB .local Chicago 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...
MongoDB .local Chicago 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pi...
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
 
MongoDB World 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pipeline Em...
MongoDB World 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pipeline Em...MongoDB World 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pipeline Em...
MongoDB World 2019: Aggregation Pipeline Power++: How MongoDB 4.2 Pipeline Em...
 
MongoDB .local Bengaluru 2019: Aggregation Pipeline Power++: How MongoDB 4.2 ...
MongoDB .local Bengaluru 2019: Aggregation Pipeline Power++: How MongoDB 4.2 ...MongoDB .local Bengaluru 2019: Aggregation Pipeline Power++: How MongoDB 4.2 ...
MongoDB .local Bengaluru 2019: Aggregation Pipeline Power++: How MongoDB 4.2 ...
 
Aggregation Framework
Aggregation FrameworkAggregation Framework
Aggregation Framework
 
The Aggregation Framework
The Aggregation FrameworkThe Aggregation Framework
The Aggregation Framework
 
Webinar: Data Processing and Aggregation Options
Webinar: Data Processing and Aggregation OptionsWebinar: Data Processing and Aggregation Options
Webinar: Data Processing and Aggregation Options
 
Max Neunhöffer – Joins and aggregations in a distributed NoSQL DB - NoSQL mat...
Max Neunhöffer – Joins and aggregations in a distributed NoSQL DB - NoSQL mat...Max Neunhöffer – Joins and aggregations in a distributed NoSQL DB - NoSQL mat...
Max Neunhöffer – Joins and aggregations in a distributed NoSQL DB - NoSQL mat...
 
Introduction to MongoDB for C# developers
Introduction to MongoDB for C# developersIntroduction to MongoDB for C# developers
Introduction to MongoDB for C# developers
 
MongoDB .local Paris 2020: La puissance du Pipeline d'Agrégation de MongoDB
MongoDB .local Paris 2020: La puissance du Pipeline d'Agrégation de MongoDBMongoDB .local Paris 2020: La puissance du Pipeline d'Agrégation de MongoDB
MongoDB .local Paris 2020: La puissance du Pipeline d'Agrégation de MongoDB
 
Barcelona.pm Curs1211 sess01
Barcelona.pm Curs1211 sess01Barcelona.pm Curs1211 sess01
Barcelona.pm Curs1211 sess01
 
MongoDB Aggregation Framework
MongoDB Aggregation FrameworkMongoDB Aggregation Framework
MongoDB Aggregation Framework
 
MongoDB Aggregations Indexing and Profiling
MongoDB Aggregations Indexing and ProfilingMongoDB Aggregations Indexing and Profiling
MongoDB Aggregations Indexing and Profiling
 
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
 
Perl6 grammars
Perl6 grammarsPerl6 grammars
Perl6 grammars
 

More from MongoDB

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

More from MongoDB (20)

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

Recently uploaded

Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024BookNet Canada
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Unlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power SystemsUnlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power SystemsPrecisely
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 

Recently uploaded (20)

Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
 
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Unlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power SystemsUnlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power Systems
 
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 

[MongoDB.local Bengaluru 2018] Tutorial: Pipeline Power - Doing More with MongoDB Aggregation