0

我有一个包含以下格式的帖子的存储桶:

{title:"foo", 
description:"bar", 
votes: {John:1, Leo:-1, ...}}

我将不断查询投票数少于 N 且尚未由特定用户投票的帖子。问题是:我不能为每个特定用户创建视图,所以我必须设置一个来过滤 <50 票的帖子,然后以编程方式过滤那些没有被特定用户投票的帖子。这是解决这个问题的正确方法吗?

4

1 回答 1

3

如果您有许多可以投票的用户,则不应使用您的方法,因为要添加投票,您需要:

  1. 获取文件
  2. 将 json 解析成某种结构
  3. 添加一些投票来投票数组
  4. 将对象写回基础

因此,如果其他人在 1 到 4 步之间投票,而您没有检查CAS回信,则该投票将丢失。如果你检查CAS并且投票来得很快,你可能会得到非常慢的性能。

正如我之前所说,解决方案是在 JSON 中分别保存选票,例如:

{
  "type":"vote",
  "voterId": 123,
  "votedFor": 321,
  "timestamp": 131321321
}

并在没有投票的情况下存储您的项目,如下所示:

{
  "type":"item",
  "itemId": 321,
  "title": foo
}

使用此方案,您仅在需要计算投票时才使用投票,查看用户对某些项目的投票等。

另一个技巧:如果你需要显示投票,即在你的网站上,你也可以有“fast_voutes_count”。这意味着您可以创建单独的变量,该变量将仅存储每个项目的投票数votes:count:for:<itemId>:如果有人投票,您应该:

  1. 按键增加项目投票计数值:votes:count:for:<itemId>
  2. 将用户的投票存储为投票文档 ( {"type":"vote","voterId": 123,"votedFor": 321, "timestamp": 131321321})。

所以第一个值将用于在网站上显示投票。第二个将用于计算您的统计数据。

要创建您需要的视图(map、reduce 函数),您可以参考本手册及其示例。如果您不熟悉 map/reduce,请首先尝试创建一个仅显示特定 itemId 投票的视图,这是一个小示例:

map: 
function(){
  if (meta.type === "json" && doc.type === "vote"){
    emit(doc.votedFor, null);
  }
}

然后,如果您想计算(总和)投票,只需将_count其用作 reduce 函数。

PS:在我的应用程序中,我们使用这种方法来计算视频的观看次数:一个名为“fast_clip_view”的键值用于在网站上显示信息,另一个使用 的详细剪辑视图userIdclipId以及timestamp详细的统计信息。

顺便说一句,如果您需要“票数排名前 10 项”之类的内容,请参阅此问题

于 2013-06-22T18:59:55.107 回答