2013-06-22 41 views
0

我有以下格式的帖子一斗:在CouchBase上获取未被用户投票的帖子的最有效方法是什么?

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

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

+0

为什么在一些物体上存票?在你的情况下是否有可能为每个用户保存投票(可能会更简单和更有用):'''type“:”vote“,”voterId“:123,”votedForId“:1} { “类型”: “项目”, “标题”: “foo” 的}'。如果你使用你的方法,你应该处理“同时”投票,如果有许多用户可以投票,它可能会成为一个问题。 – m03geek

+0

@Alex呃,那是令我感到困惑的事情:我以为我实际上应该避免分离那样的物体。那么,那好一点。但我真的需要一个有这些东西的指南/教程!有很多(简单)的事情不清楚,我真的没有找到官方文档!是的,有很多用户可以投票。整个事情实际上只是一个页面,你可以尽快地在帖子中投票。 – MaiaVictor

回答

3

如果你有一个可以投票,你不应该用你的方法,因为添加你需要表决许多用户:

  1. 获取文件
  2. 解析JSON到一些结构
  3. 添加一些投票表决阵列
  4. 写对象返回基地

所以,如果1个4步骤之间别人的票,你不在回写时检查CAS,那票将会丢失。如果您检查CAS并且投票速度非常快,您可以获得非常缓慢的表现。

的解决方案是,正如我以前说过,在JSON separatly保存票,如:

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

和存储您的项目,而不票,像这样:

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

有了这个计划你的工作只有当你需要统计他们的投票时,看看用户投了些什么项目等等。

另一个窍门:如果你需要显示投票,即在你的网站上,你也可以有“fast_v outes_count”。这意味着您可以创建单独的变量来存储每个项目的票数:votes:count:for:<itemId>。如果有人投票项目,你应该:通过关键

  1. 递增项计票值:votes:count:for:<itemId>
  2. 存储用户的投票表决作为文件({"type":"vote","voterId": 123,"votedFor": 321, "timestamp": 131321321})。

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

为了创建你需要的视图(地图,缩小功能),你可以参考这个manual,它是一个例子。如果你是新来的Map/Reduce首先尝试创建一个仅用于特定的itemId显示票来看,这里是个小例子:

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

然后,如果你想计算(和)那票只需使用_count作为减少功能。

PS:在我的应用程序,我们使用这种方法来计算的观点为视频:用于显示在网站上的信息,并与userIdclipIdtimestamp详细统计其他的详细clipview称为“fast_clip_view”一个键值。顺便说一句,如果你需要像“票前十项”这样的东西,请参阅question

相关问题