Built-In Reduce Functions

See also the official documentation for this topic.

CouchDB has three built-in reduce functions. These are implemented in Erlang and run right inside CouchDB, so they are much faster than the equivalent JavaScript functions.

Usage

To use built-in reduce functions, you simply need to replace your reduce function with the string _count, _sum or _stats (without any preceding or tailing whitespace).

Here is an example design document using built-in reduce functions:

{
  "_id":"_design/company",
  "_rev":"12345",
  "language": "javascript",
  "views":
  {
    "all_customers": {
      "map": "function(doc) { if (doc.type == 'customer')  emit(doc.id, 1) }",
      "reduce" : "_count"
    },
    "total_purchases_by_customer": {
      "map": "function(doc) { if (doc.type == 'purchase')  emit(doc.customer_id, doc.amount) }",
      "reduce": "_sum"
    }
  }
}

Available Built-In Functions

_sum

_sum just adds up the emitted values, which must be numbers.

The JavaScript equivalent is:

function(keys, values, rereduce) {
  return sum(values);
}

_count

_count counts the number of emitted values. (It's like _sum for emit(foo, 1).) It ignores the contents of the values, so they can by any type.

The JavaScript equivalent is:

function(keys, values, rereduce) {
  if (rereduce) {
    return sum(values);
  } else {
    return values.length;
  }
}

_stats

_stats calculates some numerical statistics on your emitted values, which must be numbers.

The reduce output is an object that looks like this:

{"sum":2,"count":2,"min":1,"max":1,"sumsqr":2}

"sum" and "count" are equivalent to the _sum and _count reductions. "min" and "max" are the minimum and maximum emitted values. "sumsqr" is the sum of the squares of the emitted values (useful for statistical calculations like standard deviation).

Built-In_Reduce_Functions (last edited 2013-06-05 21:55:29 by 71)