此任务是聚合框架的经典任务:http: //docs.mongodb.org/manual/core/aggregation/
对于第一个变体,您可以使用如下内容:
test> db.video.aggregate([{$unwind:'$stats'}, {$group:{_id:{name:'$video_name', day:'$stats.day'}, views:{$sum:'$stats.views'}}}])
{
"result" : [
{
"_id" : {
"name" : "Blabla2",
"day" : 3
},
"views" : 344
},
{
"_id" : {
"name" : "Blabla2",
"day" : 1
},
"views" : 684
},
{
"_id" : {
"name" : "Blabla",
"day" : 2
},
"views" : 342
},
{
"_id" : {
"name" : "Blabla2",
"day" : 2
},
"views" : 342
},
{
"_id" : {
"name" : "Blabla",
"day" : 1
},
"views" : 342
}
],
"ok" : 1
但是如果您的视频数量会像雪崩一样增加,您将来可能会遇到问题。您可以使用帮助 $match 操作精确计算某一天的统计数据,但这是临时解决方案。
好主意是将数据模型更改为更简单(如果可以的话):
{
video_name: "Blabla",
day: x,
views: 342}
}
在此模型中,您不依赖于文档的大小,聚合框架可帮助您创建分析视图:
db.video.aggregate([{$group:{_id:{name:'$video_name', day:'$day'}, views:{$sum:'$views'}}}])
您可以简单地选择任何一天或一天的间隔,您可以按视频或视频的名称和日期分组,您可以根据需要自由计算任何统计数据;)