I follow the manual http://www.mongodb.org/display/DOCS/MapReduce and defines the scope variable to pass in the dimension info:
// the map function var map = function() { var dimension = this[dimension] ? this[dimension] : "_"; var key = this.inst + "|" + this.bar + "|" + dimension; var result = {hit: 1}; emit(key, result); }; // the statement to call mapreduce db.foo.mapReduce(map, reduce, { out: {inline: 1}, query: q, scope: {dimension: "red"}});
I run the above map reduce and found the dimension is always empty unless I noticed that
dimension
is redefined in the map function. Change the map funciton to the following solves the problem:
// the map function var map = function() { var d= this[dimension] ? this[dimension] : "_"; // changed var key = this.inst + "|" + this.bar + "|" + d; // changed var result = {hit: 1}; emit(key, result); };
scope variables are placed in global scope. ( dimension NOT this.dimension)
ReplyDeletethis represents a single record ( or document ) and you access the attributes via this[attr]
first example tries to overwrite scope variable from 'red' to this.dimension OR "_"
second example ignores scope variable and uses this.dimension to create var d.