2013-06-12 37 views
5

bộ sưu tập của tôi trong MongoDB trông giống như dưới đây:nhóm theo mongoose.js tháng, năm sử dụng

{ 
    "AccountID" : "87f7fd60-d1ad-11e2-98bb-795730bce125", 
    "userId" : ObjectId("51b59fbec46916e60d00000c"), 
    "_id" : ObjectId("51b6e603e3efef161b000003"), 
    "accessDate" : ISODate("2013-06-11T08:55:31.957Z"), 
    "__v" : 0 
} 
{ 
     "AccountID" : "47f7fd60-d1ad-11e2-98bb-795730bce125", 
     "userId" : ObjectId("51b59fbec46916e60d00000d"), 
     "_id" : ObjectId("51b6e603e3efef161b000003"), 
     "accessDate" : ISODate("2013-05-1T08:05:31.957Z"), 
     "__v" : 0 
} 

i gì để viết một truy vấn mà kết quả kết quả dưới đây: này là kết quả như nhóm lại theo tháng, năm và số lượng mỗi ngày.

{ 
    "usage": [ 
    { 
     "year": 2013, 
     "monthlyusage": [ 
     { 
      "month": 1, 
      "dailyusage": [ 
      { 
       "day": 1, 
       "count": 205 
      }, 
      { 
       "day": 2, 
       "count": 1109 
      }, 
      { 
       "day": 4, 
       "count": 455 
      } 
      ] 
     }, 
     { 
      "month": 2, 
      "dailyusage": [ 
      { 
       "day": 11, 
       "count": 256 
      }, 
      { 
       "day": 2, 
       "count": 1001 
      }, 
      { 
       "day": 5, 
       "count": 65 
      } 
      ] 
     } 
     ] 
    }, 
    { 
     "year": 2012, 
     "monthlyusage": [ 
     { 
      "month": 12, 
      "dailyusage": [ 
      { 
       "day": 1, 
       "count": 78 
      }, 
      { 
       "day": 2, 
       "count": 7009 
      }, 
      { 
       "day": 28, 
       "count": 55 
      } 
      ] 
     }, 
     { 
      "month": 11, 
      "dailyusage": [ 
      { 
       "day": 11, 
       "count": 800 
      }, 
      { 
       "day": 2, 
       "count": 5094 
      }, 
      { 
       "day": 25, 
       "count": 165 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

Làm thế nào tôi có thể làm điều này bằng mongoose.js khuôn khổ

+0

sử dụng khung tổng hợp. –

Trả lời

17

Mongoose cung cấp một wrapper nhẹ xung quanh khuôn khổ hợp MongoDB. Nếu bạn mới tập hợp, bạn có thể tìm hiểu thêm về từ tài liệu MongoDB: http://docs.mongodb.org/manual/aggregation/

Để xoa bóp dữ liệu của bạn thành biểu mẫu mà bạn đã mô tả ở trên, bạn có thể sử dụng một đường ống tổng hợp với một loạt các hoạt động nhóm $ . Ở đây nó được sử dụng khuôn khổ cầy mangut:

var dateSchema = mongoose.Schema({…}); 
var DateItem = mongoose.model('DateItem', dateSchema); 

DateItem.aggregate(
     { $group : { 
      _id : { year: { $year : "$accessDate" }, month: { $month : "$accessDate" },day: { $dayOfMonth : "$accessDate" }}, 
      count : { $sum : 1 }} 
      }, 
     { $group : { 
      _id : { year: "$_id.year", month: "$_id.month" }, 
      dailyusage: { $push: { day: "$_id.day", count: "$count" }}} 
      }, 
     { $group : { 
      _id : { year: "$_id.year" }, 
      monthlyusage: { $push: { month: "$_id.month", dailyusage: "$dailyusage" }}} 
      }, 
     function (err, res) 
      { if (err) ; // TODO handle error 
      console.log(res); 
      }); 
}); 

Các $ nhóm đầu tiên sẽ cho kết quả trong các văn bản của mẫu đơn này, một cho mỗi ngày:

{ 
    "_id" : { "year" : 2013, "month" : 8, "day" : 15 }, 
    "count" : 1 
} 

Các $ nhóm thứ hai sẽ cho kết quả trong các tài liệu được nhóm theo tháng :

{ 
    "_id" : { "year" : 2012, "month" : 11 }, 
"dailyusage" : [ 
      { "day" : 6, "count" : 1 }, 
      { "day" : 9, "count" : 1 }, 
      ... ] 
}, 

Và nhóm $ thứ ba sẽ dẫn đến tài liệu lớn hơn, một cho mỗi năm.

Truy vấn này sẽ tổng hợp dữ liệu của bạn thành các tài liệu có thứ bậc lớn. Tuy nhiên, nếu bạn có kế hoạch chạy truy vấn trên dữ liệu này sau khi tổng hợp, đây có thể không phải là biểu mẫu hữu ích nhất cho dữ liệu của bạn. Hãy xem xét cách bạn sẽ sử dụng dữ liệu tổng hợp. Một lược đồ liên quan đến nhiều tài liệu nhỏ hơn, có lẽ một tài liệu mỗi tháng hoặc thậm chí một tài liệu mỗi ngày, có thể thuận tiện hơn.

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