2013-06-12 5 views
5

моя коллекция в MongoDB выглядит следующим образом:группы по месяцам и годам, используя 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 
} 

я что написать запрос, который приводит ниже результат: это результат, как сгруппированы по месяцам и годам и количество в день.

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

Как я могу сделать это с помощью mongoose.js Рамочного

+0

использование агрегация структура. –

ответ

17

Mongoose обеспечивает легкую оболочку вокруг рамки агрегации MongoDB. Если вы новичок в агрегировании, вы можете узнать больше о нем из документов MongoDB: http://docs.mongodb.org/manual/aggregation/

Чтобы массировать ваши данные в форму, описанную выше, вы можете использовать конвейер агрегации с серией операций группы $ group , Здесь он использует рамку мангуста:

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

Первые $ группа приведет к документам этой формы, по одному на каждый день:

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

Вторые $ группа приведет к документам, сгруппированных по месяцам :

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

И третья группа $ приведет к еще большему количеству документов, по одному на каждый год.

Этот запрос объединит ваши данные в большие иерархические документы. Однако, если вы планируете запускать запросы по этим данным после агрегации, это может быть не самая полезная форма для ваших данных. Рассмотрим, как вы будете использовать агрегированные данные. Возможно, более удобна схема, включающая более мелкие документы, возможно, один месяц или даже один день.

Смежные вопросы