按月份和年份使用mongoose.js

我在MongoDB中的collections如下所示:

{ "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框架

Mongoose为MongoDB汇总框架提供了一个轻量级的包装。 如果您不熟悉聚合,可以从MongoDB文档中了解更多信息: http : //docs.mongodb.org/manual/aggregation/

要将数据按照上面描述的forms进行处理,可以使用包含一系列$ group操作的聚合pipe道。 这里是使用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); }); }); 

第一个$组将产生这种forms的文件,每天一个:

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

第二个$组将导致文档按月分组:

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

而第三个小组将导致更大的文件,每年一个。

这个查询将把你的数据聚合成大的分层文件。 但是,如果您计划在汇总后对这些数据执行查询,则这可能不是您数据最有用的forms。请考虑如何使用汇总的数据。 涉及更小文档的模式,可能每月一个,甚至每天一个,可能会更方便。