MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

gruppi per mese e anno utilizzando mongoose.js

Mongoose fornisce un wrapper leggero attorno al framework di aggregazione MongoDB. Se non conosci l'aggregazione, puoi saperne di più dai documenti MongoDB:http:/ /docs.mongodb.org/manual/aggregation/

Per inserire i tuoi dati nel modulo descritto sopra, puoi utilizzare una pipeline di aggregazione con una serie di operazioni $group. Qui sta usando il framework mangusta:

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); 
           });
});

Il primo $gruppo risulterà in documenti di questo modulo, uno per ogni giorno:

{ 
  "_id" : { "year" : 2013, "month" : 8, "day" : 15 },
  "count" : 1
}

Il secondo $gruppo risulterà in documenti raggruppati per mese:

{
  "_id" : { "year" : 2012, "month" : 11 },
 "dailyusage" : [
          { "day" : 6, "count" : 1 },
          { "day" : 9, "count" : 1 },
          ... ]
},

E il terzo $gruppo risulterà in documenti ancora più grandi, uno per ogni anno.

Questa query aggregherà i tuoi dati in documenti gerarchici di grandi dimensioni. Se prevedi di eseguire query su questi dati dopo l'aggregazione, tuttavia, questa potrebbe non essere la forma più utile in cui inserire i tuoi dati. Considera come utilizzerai i dati aggregati. Uno schema che coinvolge documenti più piccoli, magari uno al mese o anche uno al giorno, potrebbe essere più conveniente.