Map-Reduce Examples
In the mongo
shell, the db.collection.mapReduce()
method is a wrapper around the mapReduce
command. Thefollowing examples use the db.collection.mapReduce()
method:
Consider the following map-reduce operations on a collectionorders
that contains documents of the following prototype:
- {
- _id: ObjectId("50a8240b927d5d8b5891743c"),
- cust_id: "abc123",
- ord_date: new Date("Oct 04, 2012"),
- status: 'A',
- price: 25,
- items: [ { sku: "mmm", qty: 5, price: 2.5 },
- { sku: "nnn", qty: 5, price: 2.5 } ]
- }
Return the Total Price Per Customer
Perform the map-reduce operation on the orders
collection to groupby the cust_id
, and calculate the sum of the price
for eachcust_id
:
Define the map function to process each input document:
- In the function,
this
refers to the document that themap-reduce operation is processing. - The function maps the
price
to thecust_id
for eachdocument and emits thecust_id
andprice
pair.
- In the function,
- var mapFunction1 = function() {
- emit(this.cust_id, this.price);
- };
Define the corresponding reduce function with two arguments
keyCustId
andvaluesPrices
:- The
valuesPrices
is an array whose elements are theprice
values emitted by the map function and grouped bykeyCustId
. - The function reduces the
valuesPrice
array to thesum of its elements.
- The
- var reduceFunction1 = function(keyCustId, valuesPrices) {
- return Array.sum(valuesPrices);
- };
- Perform the map-reduce on all documents in the
orders
collectionusing themapFunction1
map function and thereduceFunction1
reduce function.
- db.orders.mapReduce(
- mapFunction1,
- reduceFunction1,
- { out: "map_reduce_example" }
- )
This operation outputs the results to a collection namedmap_reduce_example
. If the map_reduce_example
collectionalready exists, the operation will replace the contents with theresults of this map-reduce operation:
Calculate Order and Total Quantity with Average Quantity Per Item
In this example, you will perform a map-reduce operation on theorders
collection for all documents that have an ord_date
value greater than 01/01/2012
. The operation groups by theitem.sku
field, and calculates the number oforders and the total quantity ordered for each sku
. The operation concludes bycalculating the average quantity per order for each sku
value:
Define the map function to process each input document:
- In the function,
this
refers to the document that themap-reduce operation is processing. - For each item, the function associates the
sku
with a newobjectvalue
that contains thecount
of1
and theitemqty
for the order and emits thesku
andvalue
pair.
- In the function,
- var mapFunction2 = function() {
- for (var idx = 0; idx < this.items.length; idx++) {
- var key = this.items[idx].sku;
- var value = {
- count: 1,
- qty: this.items[idx].qty
- };
- emit(key, value);
- }
- };
Define the corresponding reduce function with two arguments
keySKU
andcountObjVals
:countObjVals
is an array whose elements are the objectsmapped to the groupedkeySKU
values passed by mapfunction to the reducer function.- The function reduces the
countObjVals
array to a singleobjectreducedValue
that contains thecount
and theqty
fields. - In
reducedVal
, thecount
field contains the sum of thecount
fields from the individual array elements, and theqty
field contains the sum of theqty
fields from theindividual array elements.
- var reduceFunction2 = function(keySKU, countObjVals) {
- reducedVal = { count: 0, qty: 0 };
- for (var idx = 0; idx < countObjVals.length; idx++) {
- reducedVal.count += countObjVals[idx].count;
- reducedVal.qty += countObjVals[idx].qty;
- }
- return reducedVal;
- };
- Define a finalize function with two arguments
key
andreducedVal
. The function modifies thereducedVal
objectto add a computed field namedavg
and returns the modifiedobject:
- var finalizeFunction2 = function (key, reducedVal) {
- reducedVal.avg = reducedVal.qty/reducedVal.count;
- return reducedVal;
- };
- Perform the map-reduce operation on the
orders
collection usingthemapFunction2
,reduceFunction2
, andfinalizeFunction2
functions.
- db.orders.mapReduce( mapFunction2,
- reduceFunction2,
- {
- out: { merge: "map_reduce_example" },
- query: { ord_date:
- { $gt: new Date('01/01/2012') }
- },
- finalize: finalizeFunction2
- }
- )
This operation uses the query
field to select only thosedocuments with ord_date
greater than newDate(01/01/2012)
. Then it output the results to a collectionmap_reduce_example
. If the map_reduce_example
collectionalready exists, the operation will merge the existing contents withthe results of this map-reduce operation.