2012-02-18 12 views
5

Mam szereg dokumentów, które wyglądają tak:CouchDB Map/Reduce do tablicy

{userId: 123, msg:{ timestamp:123456, event:"actionA"} }

{userId: 123, msg:{ timestamp:123466, event:"actionB"} }

etc...

Mapa Fn:

emit(doc.userId, [doc.msg])

Zmniejszenie Fn:

return [].concat.apply([], vs)

Funkcje te wydają się zrobić to, czego oczekuję, więc myślałem, że dożyję wyjście jak:

Key: 123, Value: [{timestamp:123456, event:"actionA"}, {timestamp:123466, event:"actionB"}, ...etc...]

Ale jestem coraz zmniejszyć błąd przepełnienia, "Zmniejszanie produkcji musi się szybciej skurczyć". Rzeczywiście, couchdb docs mówi, że "Jako reguła, funkcja redukcji powinna zmniejszyć się do pojedynczej wartości skalarnej." ... "CouchDB da ci ostrzeżenie, jeśli spróbujesz użyć zmniejszenia" w niewłaściwy sposób "".

Sądzę, że używam Couch MR "w niewłaściwy sposób". Jaka byłaby "właściwa droga" do tego rodzaju obliczeń?

Odpowiedz

4

Też uderzyłem to zbyt wcześniej. CouchDB lubi wysokie listy, a nie listy tłuszczu. Innymi słowy, możesz prawdopodobnie uzyskać to, co chcesz, używając klawiszy w widoku i nie zmniejszając ich do tego samego.

Jeśli chcesz zobaczyć wszystkie wiadomości od ID użytkownika, nie potrzebujesz funkcji zmniejszania. Po prostu przetestuj swój widok za pomocą ?key=123. Zobaczysz wszystkie komunikaty dla tego ID użytkownika i nie ma ograniczenia co do rozmiaru.

Jeśli jesteś niezadowolony z formatu (jeśli po prostu musi zmienić JSON, który przesyła ci kanapa), to link funkcji listy Simona jest poprawny.

2

Myślę, że właściwą drogą jest użycie list function. Możesz mieć funkcję wyjścia JSON na liście, jeśli tego chcesz.