2010-10-07 24 views
5

Tôi có một bộ sưu tập MongoDB có created_at được lưu trữ trong mỗi tài liệu. Chúng được lưu trữ dưới dạng đối tượng ngày MongoDB, ví dụ:Bản đồ-Giảm số lượng tài liệu trong mỗi phút MongoDB

{ "_id" : "4cacda7eed607e095201df00", "created_at" : "Wed Oct 06 2010 21:22:23 GMT+0100 (BST)", text: "something" } 
{ "_id" : "4cacdf31ed607e0952031b70", "created_at" : "Wed Oct 06 2010 21:23:42 GMT+0100  (BST)", text: "something" } 
.... 

Tôi muốn đếm số lượng các mặt hàng được tạo ra giữa mỗi phút, vì vậy tôi có thể vượt qua các dữ liệu vào bảng xếp hạng của Google để tạo ra một cái gì đó như thế này:

alt text

Làm thế nào để làm điều này với chức năng giảm bản đồ, hoặc có một hàm tổng hợp MongoDB ưa thích mà tôi có thể sử dụng thay thế không?

Trả lời

8

Bản đồ chức năng nên phát ra một đối tượng dấu thời gian, điều chỉnh lên đến phút và đếm 1. giảm chức năng nên tổng hợp tất cả các tội:

map = function() { 
    var created_at_minute = new Date(this.created_at.getFullYear(), 
            this.created_at.getMonth(), 
            this.created_at.getDate(), 
            this.created_at.getHours(), 
            this.created_at.getMinutes()); 
    emit(created_at_minute, {count: 1}); 
} 

reduce = function(key, values) { 
    var total = 0; 
    for(var i = 0; i < values.length; i++) { 
     total += values[i].count; 
    } 
    return {count: total}; 
} 
+0

http://pastebin.me/51e1e0f24cb174991ebd9072f1d9bbec - Đã thử nghiệm với một số thử nghiệm thô, dường như đang làm những gì áp phích dự định ... +1 – gnarf

+0

Điều này làm việc một điều trị, cảm ơn! – Tom

0

Bạn cũng có thể thử group chức năng.


db.stat.group({key:{"create_at_minute":true} 
       ,initial:{count:0} 
       ,reduce:function(doc,out){out.count++}}) 

trong đó create_at_minute là trường create_at của bạn được làm tròn theo phút.

+0

Trường hợp nào create_at_minute đến từ, không mongodb con số nó ra khi tôi chạy truy vấn đó? – Tom

+0

.group() là một cách dễ dàng hơn để đạt được tổng hợp, tuy nhiên nó có những hạn chế. Đối tượng BSON trả về phải nhỏ, với các khóa nhỏ hơn 10K, nếu không bạn sẽ nhận được một ngoại lệ. – rubayeet

+0

10K minutues là khoảng 6 ngày ... – walla

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