2013-06-12 16 views
5

mia collezione in MongoDB si presenta come di seguito:gruppi per mese e anno utilizzando mongoose.js

{ 
    "AccountID" : "87f7fd60-d1ad-11e2-98bb-795730bce125", 
    "userId" : ObjectId("51b59fbec46916e60d00000c"), 
    "_id" : ObjectId("51b6e603e3efef161b000003"), 
    "accessDate" : ISODate("2013-06-11T08:55:31.957Z"), 
    "__v" : 0 
} 
{ 
     "AccountID" : "47f7fd60-d1ad-11e2-98bb-795730bce125", 
     "userId" : ObjectId("51b59fbec46916e60d00000d"), 
     "_id" : ObjectId("51b6e603e3efef161b000003"), 
     "accessDate" : ISODate("2013-05-1T08:05:31.957Z"), 
     "__v" : 0 
} 

ho cosa scrivere una query che si traduce il risultato qui sotto: questo è il risultato sotto forma raggruppati per mese e anno e il conteggio al giorno.

{ 
    "usage": [ 
    { 
     "year": 2013, 
     "monthlyusage": [ 
     { 
      "month": 1, 
      "dailyusage": [ 
      { 
       "day": 1, 
       "count": 205 
      }, 
      { 
       "day": 2, 
       "count": 1109 
      }, 
      { 
       "day": 4, 
       "count": 455 
      } 
      ] 
     }, 
     { 
      "month": 2, 
      "dailyusage": [ 
      { 
       "day": 11, 
       "count": 256 
      }, 
      { 
       "day": 2, 
       "count": 1001 
      }, 
      { 
       "day": 5, 
       "count": 65 
      } 
      ] 
     } 
     ] 
    }, 
    { 
     "year": 2012, 
     "monthlyusage": [ 
     { 
      "month": 12, 
      "dailyusage": [ 
      { 
       "day": 1, 
       "count": 78 
      }, 
      { 
       "day": 2, 
       "count": 7009 
      }, 
      { 
       "day": 28, 
       "count": 55 
      } 
      ] 
     }, 
     { 
      "month": 11, 
      "dailyusage": [ 
      { 
       "day": 11, 
       "count": 800 
      }, 
      { 
       "day": 2, 
       "count": 5094 
      }, 
      { 
       "day": 25, 
       "count": 165 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

come posso farlo usando mongoose.js quadro

+0

utilizzare il framework di aggregazione. –

risposta

17

Mongoose fornisce un wrapper leggero intorno al quadro di aggregazione MongoDB. Se non hai familiarità con la documentazione di MongoDB: http://docs.mongodb.org/manual/aggregation/

Per eseguire il massaggio dei dati nel modulo sopra descritto, puoi utilizzare una pipeline di aggregazione con una serie di operazioni $ di gruppo . Qui si 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 $ si tradurrà in documenti di questo modulo, uno per ogni giorno:

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

Il secondo gruppo $ comporterà documenti raggruppati per mese :

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

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

Questa query consente di aggregare i 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 per i tuoi dati. Considera come utilizzerai i dati aggregati. Uno schema che coinvolge documenti più piccoli, forse uno al mese o anche uno al giorno, potrebbe essere più conveniente.

Problemi correlati