0

我们的视频每天都有一定的观看次数。

我在想这样做:

{
    video_name: "Blabla"
    stats: [
      {day: x, views: 342}
      {day: x, views: 342}
     ]
}

但是,从我在网上阅读的分析/数据资料来看,人们往往更喜欢单独的集合,所以更多的是这样的:

{
    video_name: "Blabla"
}

{day: x, views: 342, video_id: y}
{day: x, views: 342, video_id: y}

你有什么看法?

4

1 回答 1

1

此任务是聚合框架的经典任务: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'}}}])

您可以简单地选择任何一天或一天​​的间隔,您可以按视频或视频的名称和日期分组,您可以根据需要自由计算任何统计数据;)

于 2013-04-26T06:56:27.877 回答