Because the data was stored like that, but indeed for future database this will be stored as a JSON number. Still doesn't explain why the different behaviour of Number() in couch compared to 'js'. Side question: What would result in the smallest document byte size? storing it as a string like "0.345" (only need precision of 0.001) or as a JSON number? For a few docs this will not matter but in my case a dataset size of 10 million docs (seperated in different DB's), this could have a significant impact. On 21/05/10 18:41, J Chris Anderson wrote: > It's this line that looked odd to me: > >>>>> var v = new Number(values[val][v_n]); >>> > > > > I don't usually see the new Number() construct. Why not just store as a JSON number and then use values[val][v_n] directly? > > Chris > > On May 21, 2010, at 1:21 AM, Tom Sante wrote: > >> Ok the log() helped to narrow things down: >> res[v_n]={'mi':v,'ma':v,'c':1,'t':v}; >> in this context v isn't returned as a Number but as a {} >> In number context, like in a Math.min(v,othernumber); it works fine. >> Same thing happens with log: >> log(v) returns {} >> log(''+v) returns -0.453 >> >> Any reason why this would be the case since this is not the behaviour of a Number in normal js (JavaScript-C 1.7.0 2007-10-03) ? >> >> I worked around it by forcing v to become a string here >> res[v_n]={'mi':''+v,'ma':''+v,'c':1,'t':''+v}; >> But when i later do a sum like res[v_n].t += v; >> it just concats the v to it instead of adding its values >> So there i have to convert it back to a Number() before adding. >> >> On 21/05/10 10:01, Tom Sante wrote: >>> Yeah I'll try that, see if it gives me any clues. >>> Is there a way to run your code manually for debugging via the command >>> line with the JS engine the way couch calls it to build the view? (like >>> an interactive mode of couchjs) >>> >>> On 21/05/10 04:59, Zachary Zolton wrote: >>>> Reduce functions can be tricky. My best advice: try log()'ing all your >>>> input and intermediary results; the answer usually jumps out to ya. >>>> >>>> On Thursday, May 20, 2010, Tom Sante wrote: >>>>> On 20/05/10 23:52, David Goodlad wrote: >>>>> >>>>> On Thu, May 20, 2010 at 9:38 PM, Tom Sante wrote: >>>>> >>>>> Hi, >>>>> >>>>> I have a reduce function like this: >>>>> [snip] >>>>> So for some reason if there is only 1 element to be reduced, on the >>>>> line of >>>>> res[v_n]={'mi':v,'ma':v,'c':1,'t':v}; >>>>> v becomes v={} and not the actual number. Any ideas why? >>>>> >>>>> I tested the reduce function with the command line 'js' and send it the >>>>> above test keys manually as function argument and then it does result >>>>> in the >>>>> correct return: >>>>> "01:00:000074" -> {raw: {mi: -0.213, ma: -0.213, c: 1, t: -0.213}} >>>>> "01:00:000084" -> {raw: {mi: -0.213, ma: -0.213, c: 1, t: -0.213}} >>>>> >>>>> >>>>> Sounds like you need to specify group_level; Try playing around in >>>>> Futon, you'll see a group_level dropdown. >>>>> >>>>> Dave >>>>> >>>>> >>>>> Why would I need a group_level parameter? >>>>> My key is a simple string "01:00:000074". >>>>> Its my values don't get correctly generated by couchjs, since it does >>>>> out but proper values in normal commandline js. >>>>> >>>>> var v = new Number(values[val][v_n]); >>>>> if(res.hasOwnProperty(v_n)){ >>>>> res[v_n].mi = Math.min(v,res[v_n].mi); >>>>> res[v_n].ma = Math.max(v,res[v_n].ma); >>>>> res[v_n].c++; >>>>> res[v_n].t += v; >>>>> }else{ >>>>> res[v_n]={'mi':v,'ma':v,'c':1,'t':v}; >>>>> } >>>>> >>>>> It seems that in the above part in the 'else' case the v isn't a >>>>> number but an empty object {} >>>>> >>> >> > >