Viv*_*k P 6 mongoose mongodb node.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"),
"_id" : ObjectId("51b6e603e3efef161b000003"),
"accessDate" : ISODate("2013-05-1T08:05:31.957Z"),
"__v" : 0
}
Run Code Online (Sandbox Code Playgroud)
我写了一个查询结果得到以下结果:这是按月和年分组的结果和每天的计数.
{
"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
}
]
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我怎么能用mongoose.js框架做到这一点
sfr*_*ter 19
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);
});
});
Run Code Online (Sandbox Code Playgroud)
第一个$ group将生成此表单的文档,每天一个:
{
"_id" : { "year" : 2013, "month" : 8, "day" : 15 },
"count" : 1
}
Run Code Online (Sandbox Code Playgroud)
第二个$ group将生成按月分组的文档:
{
"_id" : { "year" : 2012, "month" : 11 },
"dailyusage" : [
{ "day" : 6, "count" : 1 },
{ "day" : 9, "count" : 1 },
... ]
},
Run Code Online (Sandbox Code Playgroud)
而第三个$ group将产生更大的文档,每年一个.
此查询将您的数据聚合到大型分层文档中.但是,如果您计划在聚合后对此数据运行查询,则这可能不是数据最有用的形式.请考虑如何使用聚合数据.涉及更小文档的模式(可能每月一个,甚至每天一个)可能更方便.
| 归档时间: |
|
| 查看次数: |
8030 次 |
| 最近记录: |