Mongoose giver en let indpakning omkring MongoDB-aggregationsrammerne. Hvis du er ny til aggregering, kan du lære mere om i MongoDB-dokumenterne:http:/ /docs.mongodb.org/manual/aggregation/
For at massere dine data ind i den form, du har beskrevet ovenfor, kan du bruge en aggregeringspipeline med en række $group-operationer. Her bruger den mongoose-rammen:
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);
});
});
Den første $group vil resultere i dokumenter af denne form, et for hver dag:
{
"_id" : { "year" : 2013, "month" : 8, "day" : 15 },
"count" : 1
}
Den anden $gruppe vil resultere i dokumenter grupperet efter måned:
{
"_id" : { "year" : 2012, "month" : 11 },
"dailyusage" : [
{ "day" : 6, "count" : 1 },
{ "day" : 9, "count" : 1 },
... ]
},
Og den tredje $gruppe vil resultere i endnu større dokumenter, et for hvert år.
Denne forespørgsel vil samle dine data i store, hierarkiske dokumenter. Hvis du planlægger at køre forespørgsler på disse data efter aggregering, er dette muligvis ikke den mest nyttige form for dine data at være i. Overvej, hvordan du vil bruge de aggregerede data. Et skema, der involverer flere mindre dokumenter, måske et om måneden eller endda et om dagen, kan være mere praktisk.