map-reduce

map-reduce on leveldb

Map Reduce for leveldb (via levelup)

Incremental map-reduces and real-time results.

An "incremental map reduce" means when you update one key, only a relevant protion of the data needs to be recalculated.

"real-time results" means that you can listen to the database, and recieve change notifications on the fly! a la level-live-stream

If you just want something very simple, like mapping the date a blog post is created to the blog, then level-index may be enough.

var LevelUp   = require('levelup')
var SubLevel  = require('level-sublevel')
var MapReduce = require('map-reduce')
 
var db = SubLevel(LevelUp(file))
 
var mapDb = 
  MapReduce(
    db, //the parent db 
    'example',  //name. 
    function (keyvalueemit) {
      //perform some mapping. 
      var obj = JSON.parse(value)
      //emit(key, value) 
      //key may be an array of strings.  
      //value must be a string or buffer. 
      emit(['all', obj.group], ''+obj.lines.length)
    },
    function (accvaluekey) {
      //reduce little into big 
      //must return a string or buffer. 
      return ''+(Number(acc) + Number(value))
    },
    //pass in the initial value for the reduce. 
    //*must* be a string or buffer. 
    '0'
  })
})
 

map-reduce uses level-trigger to make map reduces durable.

  //get all the results in a specific group 
  //start:[...] implies end:.. to be the end of that group. 
  mapDb.createReadStream({range: ['all', group]}) 
 
  //get all the results in under a group. 
  mapDb.createReadStream({range: ['all', true]}) 
 
  //get all the top level  
  mapDb.createReadStream({range: [true]})