2013-06-12 14 views
5

moja kolekcja w MongoDB wygląda jak poniżej:grupy przez miesiąc i rok za pomocą 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 
} 

i co napisać zapytanie, które powoduje poniższy wynik: to wynik jako pogrupowane według miesiąca i roku liczba dziennie.

{ 
    "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 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

W jaki sposób można zrobić to za pomocą mongoose.js ramowa

+0

używać struktury agregacji. –

Odpowiedz

17

Mongoose zapewnia lekką owijkę wokół ramach agregacji MongoDB. Jeśli dopiero zaczynasz agregację, możesz dowiedzieć się więcej o dokumentach MongoDB: http://docs.mongodb.org/manual/aggregation/

Aby masować dane do formularza opisanego powyżej, możesz użyć potoku agregacji z serią operacji $ group . Tutaj jest za pomocą ramy 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); 
      }); 
}); 

Pierwszy $ grupa spowoduje dokumentów tej postaci, jeden na każdy dzień:

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

Drugi $ grupa spowoduje dokumentów pogrupowanych według miesiąca :

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

I trzecia grupa $ spowoduje jeszcze większe dokumenty, po jednym na każdy rok.

To zapytanie spowoduje agregację danych w duże, hierarchiczne dokumenty. Jeśli jednak planujesz uruchomić kwerendy na tych danych po agregacji, może to nie być najbardziej przydatna forma danych. Zastanów się, jak będziesz używać zagregowanych danych. Schemat obejmujący więcej mniejszych dokumentów, może jeden na miesiąc lub nawet jeden na dzień, może być wygodniejszy.

Powiązane problemy