Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongoDB map/reduce counts

The output from MongoDB's map/reduce includes something like 'counts': {'input': I, 'emit': E, 'output': O}. I thought I clearly understand what those mean, until I hit a weird case which I can't explain.

According to my understanding, counts.input is the number of rows that match the condition (as specified in query). If so, how is it possible that the following two queries have different results?

db.mycollection.find({MY_CONDITION}).count()

db.mycollection.mapReduce(SOME_MAP, SOME_REDUCE, {'query': {MY_CONDITION}}).counts.input

I thought the two should always give the same result, independent of the map and reduce functions, as long as the same condition is used.

like image 730
ibz Avatar asked May 06 '26 22:05

ibz


1 Answers

The map/reduce pattern is like a group function in SQL. So there are grouping some result in one row. So your can't have same number of result.

The count in mapReduce() method is the number of result after the map/reduce function.

By example. You have 2 rows :

{'id':3,'num':5}
{'id':4,'num':5}

And you apply the map function

function(){
  emit(this.num, 1);
}

After this map function you get 2 rows:

{5, 1}
{5, 1}

And now you apply your reduce method :

function(k,vals) {
     var sum=0;
     for(var i in vals) sum += vals[i];
     return sum;
}

You have now only 1 row return :

2
like image 177
shingara Avatar answered May 09 '26 14:05

shingara



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!