2012-02-18 14 views
5

Tengo una serie de documentos que se parece a esto:CouchDB map/reduce a una matriz

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

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

etc...

Mapa fn:

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

Reducir fn:

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

Estas funciones parecen hacer lo que espero, por lo que había pensado que vería una salida como:

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

Pero, estoy consiguiendo un reducir el error de desbordamiento, "Reducir la salida debe reducirse más rápidamente". De hecho, el couchdb docs dice que "como regla general, la función reducir debería reducirse a un único valor escalar". ... "CouchDB le dará una advertencia si intenta usar reducir" de la manera incorrecta "".

Entonces, supongo que estoy usando Couch MR de la "manera incorrecta". ¿Cuál sería la "forma correcta" de hacer este tipo de cálculo?

Respuesta

4

He golpeado esto también antes. A CouchDB le gustan las listas altas, no las listas de grasa. En otras palabras, probablemente pueda obtener lo que desea con las claves en la vista, y no reducirlas a la misma cosa.

Si desea ver todos los mensajes de un userId, no necesita una función de reducción. Simplemente consulte su vista con ?key=123. Verá todos los mensajes para ese ID de usuario y no hay límite para el tamaño.

Si no está satisfecho con el formato (si simplemente debe cambiar el JSON que le envía el sofá), entonces el enlace de la función de lista de Simon es correcto.

2

Creo que la forma correcta es usar un list function. Puede hacer que su función de lista emita JSON si eso es lo que desea.