incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tom Sante <tom.sa...@gmail.com>
Subject Re: Reduce function results
Date Fri, 21 May 2010 17:37:14 GMT
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<tom.sante@gmail.com>  wrote:
>>>>> On 20/05/10 23:52, David Goodlad wrote:
>>>>>
>>>>> On Thu, May 20, 2010 at 9:38 PM, Tom Sante<tom.sante@gmail.com>
 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 {}
>>>>>
>>>
>>
>
>


Mime
View raw message