Hello everybody,
I have just signed up on this list so please forgive me if this
topic has been covered.
I am currently using the latest trunk version of CouchDB to experiment
with it's features and I was experimenting with doing reports and using
some views to run some data.
My map and reduce functions are:
Map:
function(doc) {
if(doc.pc && doc.cc){
emit([doc.cc,doc.pc,doc.task,doc.timestamp],doc.duration);
}
}
Reduce:
function(keys, values) {
return sum(values)
}
This produces a result like:
{"rows":[
{"key":["ACT","TXP","",1250825678],"value":5},
{"key":["ACT","TXP","",1250825960],"value":5},
{"key":["ACT","TXP","",1250827265],"value":5},
{"key":["HYD","SPR","blah",1250825378],"value":5},
{"key":["HYD","SPR","blah",1250825660],"value":5},
{"key":["HYD","SPR","blah",1250826965],"value":5},
{"key":["HYD","SPR","Phone",1250791287],"value":1},
{"key":["HYD","SPR","Phone",1250791355],"value":3}
]}
This is to be expected However I get some strange things happening if I
filter this:
/taskreport?startkey=["HYD","","",1250825660]&endkey=["HYD","\u9999","\u9999",1250826965]&group=true
{"rows":[
{"key":["HYD","SPR","blah",1250825378],"value":5},
{"key":["HYD","SPR","blah",1250825660],"value":5},
{"key":["HYD","SPR","blah",1250826965],"value":5},
{"key":["HYD","SPR","Phone",1250791287],"value":1},
{"key":["HYD","SPR","Phone",1250791355],"value":3}
]}
I would have thought that since my startkey value is greater than the
first row this should only return the last 4 rows
and in fact if I send specific data for the 2nd and 3rd keys this works:
/taskreport?startkey=["HYD","SPR","blah",1250825660]&endkey=["HYD","SPR","blah",1250826965]&group=true
{"rows":[
{"key":["HYD","SPR","blah",1250825660],"value":5},
{"key":["HYD","SPR","blah",1250826965],"value":5}
]}
I then try and group limit this result so I can group by
["HYD","SPR","blah"], hence the reason for putting the timestamp field
at the end of the keys.
/taskreport?startkey=["HYD","SPR","blah",1250825660]&endkey=["HYD","SPR","blah",1250826965]&group=true&group_level=3
{"rows":[
{"key":["HYD","SPR","blah"],"value":10}
]}
Which also works as expected.
So my question is with using start/end keys should it filter on each
individual part of the key? Should not
startkey=["HYD","","",1250825660]&endkey=["HYD","\u9999","\u9999",1250826965]&group=true
return
{"rows":[
{"key":["HYD","SPR","blah",1250825660],"value":5},
{"key":["HYD","SPR","blah",1250826965],"value":5}
]}
as well? How could I get this working? BTW If I try a group_level on this
/taskreport?startkey=["HYD",null,null,1250825660]&endkey=["HYD",{},{},1250826965]&group=true&group_level=3
I get :
{"rows":[
{"key":["HYD","SPR","blah"],"value":15},
{"key":["HYD","SPR","Phone"],"value":4}
]}
Thanks, in advance, for any help :)
Regards
Andrew Mee