Mongoose bietet einen leichtgewichtigen Wrapper um das MongoDB-Aggregationsframework. Wenn Sie neu in der Aggregation sind, können Sie in den MongoDB-Dokumenten mehr darüber erfahren:http:/ /docs.mongodb.org/manual/aggregation/
Um Ihre Daten in das oben beschriebene Formular zu pressen, können Sie eine Aggregationspipeline mit einer Reihe von $group-Vorgängen verwenden. Hier wird das Mongoose-Framework verwendet:
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);
});
});
Die erste $group führt zu Dokumenten dieser Form, eines für jeden Tag:
{
"_id" : { "year" : 2013, "month" : 8, "day" : 15 },
"count" : 1
}
Die zweite $group führt zu nach Monat gruppierten Dokumenten:
{
"_id" : { "year" : 2012, "month" : 11 },
"dailyusage" : [
{ "day" : 6, "count" : 1 },
{ "day" : 9, "count" : 1 },
... ]
},
Und die dritte $group wird zu noch größeren Dokumenten führen, eines für jedes Jahr.
Diese Abfrage aggregiert Ihre Daten in großen, hierarchischen Dokumenten. Wenn Sie jedoch planen, Abfragen für diese Daten nach der Aggregation auszuführen, ist dies möglicherweise nicht die nützlichste Form für Ihre Daten. Überlegen Sie, wie Sie die aggregierten Daten verwenden werden. Ein Schema mit mehr kleineren Dokumenten, vielleicht eines pro Monat oder sogar eines pro Tag, könnte bequemer sein.