For the ones who doesn’t knew, mongodb is a scalable, agile and document-oriented database.
One of it’s best features that I like and use is map/reduce. This feature is very useful for batch processing of data and aggregation operations.
Example:
If we have a collection like the following one:
{ “_id” : ObjectId(“1111”), “make” : [ “Maker1”], “models” : [ “Model1” , “Model2” ]}
{ “_id” : ObjectId(“1111”), “make” : [ “Maker2”], “models” : [ “Model3” ]}
{ “_id” : ObjectId(“1111”), “make” : [ “Maker1”], “models” : [ “Model2]}
we can use map reduce to number all the combinations makers – models from this collection :
Creating a map function
first of all we have to prepare the initial collection. Because for this test, we want only to count all the combinations Maker-Model we can create a “map” function like the following:
map = function() {
if (typeof this.make == "undefined") {
emit("null", { count : 1 });
} else {
for ( var i in this.make) {
if (typeof this.models == "undefined") {
emit(String(this.make[i]).toLowerCase(), {count : 1});
} else {
for ( var j in this.models) {
emit(String(this.make[i]).toLowerCase() + "-" + String(this.models[j]).toLowerCase(), {
count : 1
});
}
}
}
}
};
second we have to create a reduce function. Like its name, this function we reduce the entire collection created in “map” function to whatever we want. In this case we will sum all the values.
reduce = function(key, values) {
var total = 0;
for ( var i = 0; i < values.length; i++) {
total += values[i].count;
}
return {
count : total
};
};
calling the mapReduce function
var results = db.SearchForm.mapReduce(map,reduce);
In the end, we have to write “result” on console, to see the output of the operation.
The output may look like this, if you have enough data in the collection :
> result
{
"result" : "tmp.mr.mapreduce_1306180705_32",
"timeMillis" : 215937,
"counts" : {
"input" : 3336034,
"emit" : 3166304,
"output" : 1452
},
"ok" : 1,
}