Mongoose cung cấp một trình bao bọc nhẹ xung quanh khung tổng hợp MongoDB. Nếu bạn mới sử dụng tính năng tổng hợp, bạn có thể tìm hiểu thêm từ tài liệu MongoDB: http:/ /docs.mongodb.org/manual/aggregation/
Để biến dữ liệu của bạn thành dạng bạn đã mô tả ở trên, bạn có thể sử dụng một đường dẫn tổng hợp với một loạt các thao tác $ group. Ở đây nó đang sử dụng khung mongoose:
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);
});
});
Nhóm $ đầu tiên sẽ dẫn đến các tài liệu có dạng này, một tài liệu cho mỗi ngày:
{
"_id" : { "year" : 2013, "month" : 8, "day" : 15 },
"count" : 1
}
Nhóm $ thứ hai sẽ dẫn đến 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ẽ tạo ra các tài liệu lớn hơn nữa, mỗi năm một tài liệu.
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 lớn, có thứ bậc. Tuy nhiên, nếu bạn định chạy các 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ó thể 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.