Difference between revisions of "MapReduce"
Line 43: | Line 43: | ||
emit(this.continent, 1);}, | emit(this.continent, 1);}, | ||
function(k, v){ return v.length; }, | function(k, v){ return v.length; }, | ||
+ | {out:{"inline":1}} | ||
+ | ) | ||
+ | </pre> | ||
+ | |||
+ | ==examine the reduce function== | ||
+ | <div class=q data-lang="mongo"> | ||
+ | Examine the reduce function. | ||
+ | |||
+ | Here we emit the continent and the name, in the reduce function we return v.join(',') to see a comma separated list of the values in the list. | ||
+ | <pre class=def> | ||
+ | db.world.mapReduce( | ||
+ | function(){ | ||
+ | if (this.population>100000000) | ||
+ | emit(this.continent, this.name);}, | ||
+ | function(k, v){ return v.join(','); }, | ||
{out:{"inline":1}} | {out:{"inline":1}} | ||
) | ) | ||
</pre> | </pre> |
Revision as of 19:58, 2 August 2016
Contents
Introducing the MapReduce function
The MapReduce function is an aggregate function that consists of two functions: Map and Reduce.
The map is always performed before the reduce.
The map function examines every document in the collection and emits (key,value) pairs.
The map function takes no input however the current document can be accessed as this
The reduce function has two inputs, for every distinct key emitted by map the reduce function is called with a list of the corresponding values.
emit all continents
This example returns the number of countries in each continent.
db.world.mapReduce( function(){emit(this.continent, 1);}, function(k, v){ return v.length; }, {out:{inline:1}} )
db.world.mapReduce( function(){emit(this.continent, 1);}, function(k, v){ return v.length; }, {out:{inline:1}} )
emit only some continents
The map function may emit only sometimes.
In the example we are only counting the countries that have a large population
db.world.mapReduce( function(){ if (this.population>100000000) emit(this.continent, 1);}, function(k, v){ return v.length; }, {out:{"inline":1}} )
examine the reduce function
Examine the reduce function.
Here we emit the continent and the name, in the reduce function we return v.join(',') to see a comma separated list of the values in the list.
db.world.mapReduce( function(){ if (this.population>100000000) emit(this.continent, this.name);}, function(k, v){ return v.join(','); }, {out:{"inline":1}} )