【问题标题】:How can i record plays per users without slowing down my application?如何在不减慢应用程序速度的情况下记录每个用户的播放次数?
【发布时间】:2012-02-16 19:42:43
【问题描述】:

我正在尝试找出一种方法来记录用户的播放,而不会像 iTunes 一样减慢我的应用程序。

我的应用程序基本上是一个与 facebook 高度集成的音乐网站,facebook 用户可以登录并批准我的应用程序,然后开始听歌并制作自己的播放列表等。

应用程序是使用phpmongodb 构建的。

我已经尝试添加此功能 2 次,但每种方法都有其自身的缺陷,我只是想看看你们“专业人士”的想法,因为我在构建应用程序方面只有 1 年的经验。

方法一

创建一个名为 plays 的集合,每个文档将如下所示。

{ "user" => "user mongoid", "track" => "track mongoid" }

方法一的问题

这个问题是它会很慢,因为当我显示艺术家页面时 我必须列出最近的 20 首曲目,然后在获取曲目时,我必须检查每个曲目当前用户收听了多少。

所以在获得曲目后,我必须这样做才能让当前用户播放:

// getting the tracks.
$cursor = $this->tracks->find();
$tracks = array();

foreach ($cursor as $t) {
  // getting the number of plays.
  $t['plays'] = $this->plays->find(array('user_id' => $user, 'track_id' => $t['_id']))->count();
  $tracks[]   = $t;
}

方法二。

在用户文档中嵌入播放。 这种方法看起来不错,而且速度非常快,当用户播放曲目时,只需添加或增加该曲目的曲目数量即可。 然后只显示它们。

这个方法的问题。 MongoDB 只允许 4 mb 的文档。我不能只推送用户文档中的所有内容。

我在网上到处寻找与 mongo 遇到类似问题的人,但我没有找到。

那么如何在不降低应用程序速度的情况下记录每个用户的播放次数?

【问题讨论】:

  • 使用最新版本,文档大小限制为 16mb。

标签: php mongodb schema


【解决方案1】:

我不熟悉 MongoDB,但是将“播放”文档更改为以下内容不是更有意义:

{ "user" => "user mongoid", "track" => "track mongoid", "plays" => "number of plays" }

这样您就不必在显示艺术家概览时进行计数。我怀疑 MongoDB 可以进行非常快速的查找/更新,但基于其他问题(如 MongoDB's performance on aggregation queries)聚合似乎相当慢。

【讨论】:

    【解决方案2】:

    我建议将曲目历史记录移至另一个集合。您是正确的,集合中的一个不断变化的文档并不理想(尽管现在最大文档大小为 16MB)。

    您需要保留所有内容的历史记录还是仅保留最近 20 个历史记录?如果它只是最后 20 个,那么也许您可以将其嵌入。

    我还建议以与 John 概述的方式(上面的答案)类似的方式执行增量 ($inc) 来计算应用中的播放次数。这样您就不必使用可能很慢的 count() 进行计算。

    {'user':'<user>', 'track':'<track>','plays':1}
    

    然后使用类似这样的东西来更新

    db.col.update({'user':'aUser'},{$inc : {'plays' : 1}});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      相关资源
      最近更新 更多