Thanks Kevin. Makes sense. For the record, this is how I have it now:
var reduce = function(v) { return v.filter(function(n) { return !n.not_found }) } db.link({ bucket: "highlights", keep: false }) .map({name: 'Riak.mapValuesJson'}) .reduce({source: reduce}) .run([["user_chapters", id]])() 2010/6/15 Kevin Smith <ksm...@basho.com>: > Francisco - > > You have perfect timing. This same question came up yesterday in #riak. > > The core of the issue is Riak runs map functions on the node hosting the > relevant data. In the case of a 'not found', there is no hosting node -- the > data doesn't exist -- so the map function is never invoked for the missing > entry. The 'not found' shows up in the reduce phase because reduce phases > execute on the node coordinating the entire map/reduce job. Riak converts > link walks into map phases which is why broken links also show up as 'not > found' responses being passed to your reduce phase. > > Riak.mapValuesJson contains filtering logic since it could be used in either > map OR reduce phases. I'd recommend performing 'not found' filtering in your > reduce phases since that'll be the first opportunity you have to deal with > the missing data. > > --Kevin > On Jun 15, 2010, at 4:30 AM, francisco treacy wrote: > >> Hi all, >> >> I have a document with some broken links (i.e. that point to a >> non-existent key), and want to apply a map/reduce there. >> >> var map = function(v, k, args) { ejsLog("/tmp/mr", "hello from map"); >> return [{from: "map"}] } >> >> db.link({ bucket: "highlights", keep: false }) >> .map({source: map}) >> .run([["user_chapters", id]])() >> >> (That is, apply link+map to users_chapters/id) >> >> Result: >> [{"not_found":{"bucket":"highlights","key":"f542e13e0b5cece1f637be384e685667"}}] >> >> Makes sense because that is true. But why don't I get [{from: "map"}], >> and why is nothing logged? >> >> I presume it is just failing at the link phase, which then outputs no >> keys for the following phases. The "not found" objects should be get >> rid of at a node level, so I don't think they belong to a reduce >> phase. Or is that the case? >> >> (FWIW i got inspiration from Riak.mapValuesJson which seems to deal >> with not_founds, but I never actually seem to reach the map phase). >> >> What is the recommended approach to gracefully handle broken links? It >> should be fairly easy to exclude not found results from the resulting >> map/reduce array. >> >> Francisco >> >> _______________________________________________ >> riak-users mailing list >> riak-users@lists.basho.com >> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com > > _______________________________________________ riak-users mailing list riak-users@lists.basho.com http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com