incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From J Chris Anderson <jch...@gmail.com>
Subject Re: Reduce function results
Date Fri, 21 May 2010 17:53:57 GMT

On May 21, 2010, at 10:37 AM, Tom Sante wrote:

> 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'.
> 

The only factor I can think of is the inclusion of json2.js in the main.js source code...
You might have a look through share/server for clues.

> 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?

You'd have to experiment to know for sure. I'm gonna guess that numbers will store smaller
than strings (they will definitely sort faster).

Chris

> 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