Aggregating data
QuickStart Module
This quickstart module gives an a comprehensive overview on aggregating data using the MongoDB aggregation pipeline.
Using ODSL to create aggregation pipelines
An aggregation pipeline consists of an array of stages that are executed in order to produce an output array of resultant documents.
You can easily construct a MongoDB aggregation pipeline in the ODSL language using the aggregate command, here is a simple example:
aggregate ${object:"m101:sample_training.zips"}
match state = "NY" and city = "ALBANY"
end
Aggregation Stages
The following MongoDB Aggregation Stages are fully supported within the ODSL language:
- addFields
- bucket
- bucketAuto
- count
- documents
- facet
- geoNear
- graphLookup
- group
- limit
- lookup
- match
- merge
- out
- project
- redact
- replaceRoot
- replaceWith
- sample
- skip
- sort
- sortByCount
- unwind
All other pipeline stages can be used in ODSL in JSON format, e.g.
aggregate ${object}
{ "$collStats": { "storageStats": { } } }
end
Examples
Below are a set of examples which show a variety of aggregations, aggregation stages and functions
Match and count
aggregate ${object:"m101:sample_training.zips"}
match state = "NY" and city = "ALBANY" and pop > 5000
count "zips"
end
Using group and sort
aggregate ${object:"m101:sample_training.companies"}
group _id="$founded_year", num=sum(1)
sort num asc
end
Using addFields and project
aggregate ${object:"m101:sample_training.companies"}
match ipo != null
addFields symbol="$ipo.stock_symbol"
project name, symbol
end
Using geoNear, sort and limit
lands_end = Point([-5.712946243042564, 50.0692015134188])
aggregate ${object:"m101:sample_geospatial.shipwrecks"}
geoNear near=lands_end, distanceField="distanceFromLandsEndKm", spherical=true, distanceMultiplier=0.000156786
project name, distanceFromLandsEndKm
sort distanceFromLandsEndKm asc
limit 5
end
Using lookup
aggregate ${object:"m101:sample_mflix.movies"}
lookup from "comments" localField "_id" foreignField "movie_id" as "comments"
match comments > size(0)
limit 1
end
Using bucket
aggregate ${object:"m101:sample_training.companies"}
match founded_year > 1980 and number_of_employees != null
bucket "$number_of_employees" boundaries [ 0, 20, 50, 100, 500, 1000, Infinity ]
end
Using autoBucket
aggregate ${object:"m101:sample_training.companies"}
match founded_year > 1980 and number_of_employees != null
bucketAuto "$number_of_employees" buckets 5
end
Using unwind
aggregate ${object:"m101:sample_training.companies"}
match number_of_employees>100000
project name, city="$offices.city"
unwind "$city"
match city="Tokyo"
end