node.js – 使用mongoose.js按月和年分组

我在mongodb的收藏如下:

{
    "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"),"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
            },"count": 1001
            },{
              "day": 5,"count": 65
            }
          ]
        }
      ]
    },{
      "year": 2012,"monthlyusage": [
        {
          "month": 12,"count": 78
            },"count": 7009
            },{
              "day": 28,"count": 55
            }
          ]
        },{
          "month": 11,"count": 800
            },"count": 5094
            },{
              "day": 25,"count": 165
            }
          ]
        }
      ]
    }
  ]
}

我怎么能用mongoose.js框架做到这一点

解决方法

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

要按照上面描述的形式按摩数据,可以使用带有一系列$group操作的聚合管道.这里是使用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); 
           });
});

一个$group将生成此表单的文档,每天一个

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

第二个$group将生成按月分组的文档:

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

而第三个$group将产生更大的文档,每年一个.

查询将您的数据聚合为大型分层文档.但是,如果您计划在聚合后对此数据运行查询,则这可能不是数据最有用的形式.请考虑如何使用聚合数据.涉及更小文档的模式(可能每月一个,甚至每天一个)可能更方便.

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...