我有一个包含以下格式的帖子的存储桶:
{title:"foo",
description:"bar",
votes: {John:1, Leo:-1, ...}}
我将不断查询投票数少于 N 且尚未由特定用户投票的帖子。问题是:我不能为每个特定用户创建视图,所以我必须设置一个来过滤 <50 票的帖子,然后以编程方式过滤那些没有被特定用户投票的帖子。这是解决这个问题的正确方法吗?
如果您有许多可以投票的用户,则不应使用您的方法,因为要添加投票,您需要:
因此,如果其他人在 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>
:如果有人投票,您应该:
votes:count:for:<itemId>
{"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”的键值用于在网站上显示信息,另一个使用 的详细剪辑视图userId
,clipId
以及timestamp
详细的统计信息。
顺便说一句,如果您需要“票数排名前 10 项”之类的内容,请参阅此问题。