2013-06-12 13 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

貓鼬提供了圍繞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 }, 
      ... ] 
}, 

而第三個$組將導致更大的文檔,每年一個。

該查詢會將您的數據聚合到大型分層文檔中。但是,如果您計劃在彙總後對這些數據運行查詢,則這可能不是您數據最有用的形式。請考慮您將如何使用匯總數據。涉及更小文件的模式,可能每月一次,甚至每天一次,可能會更方便。