Mongoose fournit un wrapper léger autour du framework d'agrégation MongoDB. Si vous débutez dans l'agrégation, vous pouvez en savoir plus sur la documentation de MongoDB :http:/ /docs.mongodb.org/manual/aggregation/
Pour masser vos données sous la forme que vous avez décrite ci-dessus, vous pouvez utiliser un pipeline d'agrégation avec une série d'opérations $group. Ici, il utilise le framework 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);
});
});
Le premier $groupe donnera lieu à des documents de cette forme, un pour chaque jour :
{
"_id" : { "year" : 2013, "month" : 8, "day" : 15 },
"count" : 1
}
Le deuxième $group donnera lieu à des documents regroupés par mois :
{
"_id" : { "year" : 2012, "month" : 11 },
"dailyusage" : [
{ "day" : 6, "count" : 1 },
{ "day" : 9, "count" : 1 },
... ]
},
Et le troisième $groupe donnera lieu à des documents encore plus volumineux, un pour chaque année.
Cette requête regroupera vos données dans de grands documents hiérarchiques. Toutefois, si vous prévoyez d'exécuter des requêtes sur ces données après l'agrégation, ce n'est peut-être pas la forme la plus utile pour vos données. Réfléchissez à la manière dont vous utiliserez les données agrégées. Un schéma impliquant des documents plus petits, peut-être un par mois ou même un par jour, pourrait être plus pratique.