Mongoose предоставя лека обвивка около рамката за агрегиране на MongoDB. Ако не сте запознати с агрегирането, можете да научите повече за in от документите на MongoDB:http:/ /docs.mongodb.org/manual/aggregation/
За да масирате вашите данни във формата, която сте описали по-горе, можете да използвате тръбопровод за агрегиране с поредица от $group операции. Тук се използва рамката 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);
});
});
Първата $група ще доведе до документи от тази форма, по един за всеки ден:
{
"_id" : { "year" : 2013, "month" : 8, "day" : 15 },
"count" : 1
}
Втората група $ ще доведе до документи, групирани по месеци:
{
"_id" : { "year" : 2012, "month" : 11 },
"dailyusage" : [
{ "day" : 6, "count" : 1 },
{ "day" : 9, "count" : 1 },
... ]
},
А третата $група ще доведе до още по-големи документи, по един за всяка година.
Тази заявка ще обедини вашите данни в големи, йерархични документи. Ако обаче планирате да изпълнявате заявки за тези данни след агрегирането, това може да не е най-полезната форма за вашите данни. Помислете как ще използвате обобщените данни. Схема, включваща повече по-малки документи, може би един на месец или дори един на ден, може да бъде по-удобна.