2010-05-12 35 views
20

Tôi cần một thứ hơi phức tạp hơn các ví dụ trong tài liệu MongoDB và dường như tôi không thể quấn đầu quanh nó.Sử dụng bản đồ/giảm của MongoDB để "nhóm theo" hai trường

Nói rằng tôi có một bộ sưu tập của các đối tượng có dạng {date: "2010-10-10", type: "EVENT_TYPE_1", user_id: 123, ...}

Bây giờ tôi muốn để có được một cái gì đó tương tự như một GROUP SQL THEO truy vấn, nhóm trên cả ngày và loại. Đó là, tôi muốn số lượng sự kiện của từng loại trong mỗi ngày. Ngoài ra, tôi muốn làm cho nó độc đáo bởi user_id, tức là. nếu người dùng có nhiều sự kiện hơn trong cùng một ngày, hãy đếm nó chỉ một lần.

Tôi đang cố gắng thực hiện việc này với bản đồ/giảm.

tôi làm

db.logs.mapReduce( 
    function() { 
     emit(this.type, 1); 
    }, 
    function(k, vals) { 
     var total = 0; 
     for (var i = 0; i < vals.length; i++) 
      total += vals[i]; 
     return total; 
    } 
) 

mà độc đáo nhóm theo loại, nhưng bây giờ, làm thế nào tôi có thể nhóm theo ngày cùng một lúc? Có vẻ như chìa khóa trong emit() không thể là một mảng (tôi nghĩ về việc làm emit([this.date, this.type], 1)). Ngoài ra, làm thế nào tôi có thể đảm bảo tính độc đáo của mỗi người dùng?

Tôi mới bắt đầu với MongoDB và tôi vẫn gặp sự cố khi nắm bắt các khái niệm cơ bản. Ngoài ra, không có nhiều tài liệu có sẵn trên mạng. Bất kỳ sự trợ giúp nào từ những người dùng có kinh nghiệm đều được đánh giá cao. Cảm ơn!

+0

couchdb có thể làm mảng làm khóa, chỉ cần nói ' – dominic

Trả lời

19

Tìm thấy một giải pháp rất tốt trong sách dạy nấu ăn MongoDB (không biết về tài nguyên này trước đây).

http://cookbook.mongodb.org/patterns/unique_items_map_reduce/

Về cơ bản, vào nhóm bởi nhiều phím, bạn sử dụng một dict, không phải là một danh sách (như tôi đã cố gắng). Ngoài ra, để có được kết quả duy nhất, bạn cần thực hiện hai lần giảm bản đồ/giảm.

+3

Liên kết không hoạt động. Bất kỳ ai quan tâm đến việc nhóm/phát ra nhiều trường đều có thể sử dụng cấu trúc sau: phát ra ({date: this.date, type: this.type}, 1) –

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