Am 01.03.2010 um 14:33 schrieb Borja Martín:
Hi,
I have these documents :
{ "created_at": "20100301", "tag": "foo" },
{ "created_at": "20100301", "tag": "bar" },
{ "created_at": "20100301", "tag": "foo-bar" },
{ "created_at": "20100302", "tag": "foo" }
and what I want is to retrieve the documents within a date range and
count
how many times does each tag appear globally, not just by its date.
I should
get something like this:
{ "foo" : 2, "bar" : 1, "foo-bar" : 1}
So, in the first attempt, I wrote the following map/reduce functions:
// map
function(doc) {
emit([doc.created_at,doc.tag],1);
}
// reduce
function (key, values, rereduce) {
return sum(values);
}
Obviously this didn't work as the documents are grouped by the whole
key and
if I set the group_level to 1, the documents are grouped only by the
date:
/_design/tags/_view/popular?
startkey=["20100301",null]&endkey=["20100302",
{}]&group=true&group_level=1
{"rows":[
{"key":["20100301"],"value":3},
{"key":["20100302"],"value":1}
]}
Then I changed the emit function by setting the tag as the first
position
for the key:
...
emit([doc.tag,doc.created_at],1);
Now I can group the results and get how many times each tag appears:
/_design/tags/_view/popular?group=true&group_level=1
{"rows":[
{"key":["bar"],"value":1},
{"key":["foo"],"value":2},
{"key":["foo-bar"],"value":1}
]}
The problem with this, is that I can't restrict the query to certain
date
ranges as I get always all the documents in spite of the second part
of the
key:
/_design/tags/_view/popular?
group
=true&group_level=1&startkey=[null,"20100302"]&endkey=[{},"20100302"]
did you try group_level=2 ? so you get it for every null+created
combination?
The other thing i am looking at, is that you are using numbers as
strings i guess.
{"rows":[
{"key":["bar"],"value":1},
{"key":["foo"],"value":2},
{"key":["foo-bar"],"value":1}
]}
when I should get something like
{"rows":[
{"key":["foo"],"value":1}
]}
I was wondering if this is the normal collation behaviour or I'm
missing
anything and if there is any way to achieve this. I also tried to
add the
collation option to 'raw' in the view definition just in case, but I
got the
same results.
Thanks in advance.
Regards
--
def dagi3d(me)
case me
when :web then "http://dagi3d.net"
when :twitter then "http://twitter.com/dagi3d"
end
end
--
Sourcegarden GmbH HR: B-104357
Steuernummer: 37/167/21214 USt-ID: DE814784953
Geschaeftsfuehrer: Mario Scheliga, Rene Otto
Bank: Deutsche Bank, BLZ: 10070024, KTO: 0810929
Schoenhauser Allee 51, 10437 Berlin