MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

grupos por mês e ano usando mongoose.js


O Mongoose fornece um wrapper leve em torno da estrutura de agregação do MongoDB. Se você é novo em agregação, pode aprender mais sobre a documentação do MongoDB:http:/ /docs.mongodb.org/manual/aggregation/

Para massagear seus dados no formato descrito acima, você pode usar um pipeline de agregação com uma série de operações $group. Aqui está usando a estrutura do mangusto:
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); 
           });
});

O primeiro $grupo resultará em documentos deste formulário, um para cada dia:
{ 
  "_id" : { "year" : 2013, "month" : 8, "day" : 15 },
  "count" : 1
}

O segundo $group resultará em documentos agrupados por mês:
{
  "_id" : { "year" : 2012, "month" : 11 },
 "dailyusage" : [
          { "day" : 6, "count" : 1 },
          { "day" : 9, "count" : 1 },
          ... ]
},

E o terceiro grupo $ resultará em documentos ainda maiores, um para cada ano.

Essa consulta agregará seus dados em documentos grandes e hierárquicos. No entanto, se você planeja executar consultas nesses dados após a agregação, essa pode não ser a forma mais útil para seus dados. Considere como você usará os dados agregados. Um esquema envolvendo mais documentos menores, talvez um por mês ou mesmo um por dia, pode ser mais conveniente.