2012-02-18 43 views
5

Tôi có một số tài liệu mà trông như thế này:CouchDB Bản đồ/Giảm tới một mảng

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

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

etc...

Bản đồ fn:

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

Giảm fn:

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

Các chức năng này dường như làm những gì tôi mong đợi, vì vậy tôi đã nghĩ rằng tôi muốn nhìn thấy đầu ra như:

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

Nhưng, tôi nhận được một giảm lỗi tràn, "Giảm đầu ra phải co lại nhanh hơn". Thật vậy, các couchdb docs nói rằng "Như một quy tắc của ngón tay cái, chức năng giảm nên giảm đến một giá trị vô hướng duy nhất." ... "CouchDB sẽ cung cấp cho bạn một cảnh báo nếu bạn cố gắng sử dụng giảm" sai cách "".

Vì vậy, tôi đoán tôi đang sử dụng Couch MR "cách sai". Điều gì sẽ là "đúng cách" để làm loại tính toán?

Trả lời

4

Tôi cũng đã đạt điều này trước đây. CouchDB thích danh sách cao, không phải danh sách chất béo. Nói cách khác, bạn có thể có thể nhận được những gì bạn muốn với phím trong chế độ xem và không giảm chúng thành cùng một thứ.

Nếu bạn muốn xem tất cả thư từ userId, bạn không cần chức năng giảm. Chỉ cần truy vấn chế độ xem của bạn với ?key=123. Bạn sẽ thấy tất cả các tin nhắn cho userId đó và không có giới hạn về kích thước.

Nếu bạn không hài lòng với định dạng (nếu bạn chỉ cần phải thay đổi ghế đi văng mà gửi cho bạn), thì liên kết chức năng danh sách của Simon là chính xác.

2

Tôi nghĩ đúng cách là sử dụng list function. Bạn có thể có chức năng danh sách đầu ra của bạn JSON nếu đó là những gì bạn muốn.

Các vấn đề liên quan