Database 在CouchBase上获取未经用户投票的帖子的最有效方法是什么?

Database 在CouchBase上获取未经用户投票的帖子的最有效方法是什么?,database,node.js,couchbase,couchapp,Database,Node.js,Couchbase,Couchapp,我有一个桶,上面有以下格式的帖子: {title:"foo", description:"bar", votes: {John:1, Leo:-1, ...}} 我将继续查询投票数少于N的帖子,这些帖子还没有被特定用户投票。问题是:我无法为每个特定用户创建视图,因此我必须设置一个视图来过滤帖子如果您有许多用户可以投票,您不应该使用您的方法,因为要添加投票,您需要: 获取文档 将json解析为某种结构 向投票数组添加一些投票 将对象写回基 因此,如果其他人在1到4个步骤之间投票,而您在写回时

我有一个桶,上面有以下格式的帖子:

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

我将继续查询投票数少于N的帖子,这些帖子还没有被特定用户投票。问题是:我无法为每个特定用户创建视图,因此我必须设置一个视图来过滤帖子如果您有许多用户可以投票,您不应该使用您的方法,因为要添加投票,您需要:

  • 获取文档
  • 将json解析为某种结构
  • 向投票数组添加一些投票
  • 将对象写回基
  • 因此,如果其他人在1到4个步骤之间投票,而您在写回时未选中
    CAS
    ,则投票将失败。如果您选中CAS,并且投票速度非常快,那么您的表现可能会非常慢

    正如我之前所说,解决方案是用JSON单独保存投票,如:

    {
      "type":"vote",
      "voterId": 123,
      "votedFor": 321,
      "timestamp": 131321321
    }
    
    并在没有投票的情况下存储您的项目,如下所示:

    {
      "type":"item",
      "itemId": 321,
      "title": foo
    }
    
    使用此方案,您仅在需要计算选票、查看用户对某个项目的投票等情况下使用选票

    另一个窍门:如果你需要在网站上显示投票,你也可以使用“快速投票计数”。这意味着您可以创建单独的变量,该变量将仅存储每个项目的投票数:
    投票数:计数:for:
    。如果有人投票,你应该:

  • 按键增加项目投票计数值:
    投票:计数:for:
  • 将用户的投票存储为投票文档(
    {“type”:“vote”,“voterId”:123,“votedFor”:321,“timestamp”:131321}
  • 所以第一个值将用于在网站上显示投票。第二个将用于计算您的统计数据

    要创建您需要的视图(映射、减少函数),您可以参考下面的示例。如果您不熟悉map/reduce,请首先尝试创建一个仅显示特定itemId投票的视图,下面是一个小示例:

    map: 
    function(){
      if (meta.type === "json" && doc.type === "vote"){
        emit(doc.votedFor, null);
      }
    }
    
    然后,如果您想计算投票数(总和),只需使用
    \u count
    作为reduce函数

    PS:在我的应用程序中,我们使用这种方法来计算视频的浏览量:一个称为“fast_clip_view”的键值用于显示网站上的信息,另一个详细的clipview使用
    userId
    clipId
    时间戳
    来显示详细的统计信息


    顺便说一下,如果您需要“投票前十名”之类的内容,请参考此项。

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

  • 获取文档
  • 将json解析为某种结构
  • 向投票数组添加一些投票
  • 将对象写回基
  • 因此,如果其他人在1到4个步骤之间投票,而您在写回时未选中
    CAS
    ,则投票将失败。如果您选中CAS,并且投票速度非常快,那么您的表现可能会非常慢

    正如我之前所说,解决方案是用JSON单独保存投票,如:

    {
      "type":"vote",
      "voterId": 123,
      "votedFor": 321,
      "timestamp": 131321321
    }
    
    并在没有投票的情况下存储您的项目,如下所示:

    {
      "type":"item",
      "itemId": 321,
      "title": foo
    }
    
    使用此方案,您仅在需要计算选票、查看用户对某个项目的投票等情况下使用选票

    另一个窍门:如果你需要在网站上显示投票,你也可以使用“快速投票计数”。这意味着您可以创建单独的变量,该变量将仅存储每个项目的投票数:
    投票数:计数:for:
    。如果有人投票,你应该:

  • 按键增加项目投票计数值:
    投票:计数:for:
  • 将用户的投票存储为投票文档(
    {“type”:“vote”,“voterId”:123,“votedFor”:321,“timestamp”:131321}
  • 所以第一个值将用于在网站上显示投票。第二个将用于计算您的统计数据

    要创建您需要的视图(映射、减少函数),您可以参考下面的示例。如果您不熟悉map/reduce,请首先尝试创建一个仅显示特定itemId投票的视图,下面是一个小示例:

    map: 
    function(){
      if (meta.type === "json" && doc.type === "vote"){
        emit(doc.votedFor, null);
      }
    }
    
    然后,如果您想计算投票数(总和),只需使用
    \u count
    作为reduce函数

    PS:在我的应用程序中,我们使用这种方法来计算视频的浏览量:一个称为“fast_clip_view”的键值用于显示网站上的信息,另一个详细的clipview使用
    userId
    clipId
    时间戳
    来显示详细的统计信息


    顺便说一句,如果您需要“投票前十名”之类的东西,请参考此项。

    为什么要在某个对象中保存投票?在您的情况下,是否可以为每个用户保存投票(可能会更简单、更有用):
    {“type”:“vote”,“voterId”:123,“votedForId”:1}
    ,并且具有
    {“type”:“item”,“title”:“foo”}
    。如果你使用你的方法,你应该处理“同时”投票,如果有很多用户可以投票,这可能会成为一个问题。@Alex,嗯,这让我很困惑:我以为我应该避免像那样分离对象。那就更好了。但我真的需要一个有这些东西的指南/教程!有很多(简单的)事情不清楚,我没有在官方文件中真正找到!是的,有很多用户可以投票。整个事情实际上只是一个页面,你在帖子中不断地、尽可能快地投票。你为什么要在某个对象中保存投票?在您的情况下,是否可以为每个用户保存投票(可能会更简单、更有用):
    {“type”:“vote”,“voterId”:123,“votedForId”:1}
    ,并且具有
    {“type”:“item”,“title”:“foo”}
    。如果你使用你的方法,你应该处理“同时”投票,如果有很多用户可以投票,这可能会成为一个问题。@Alex,嗯,这让我很困惑:我以为我应该避免像那样分离对象。那就更好了。但我真的需要一个有这些东西的指南/教程!有很多(简单的)事情不清楚,我没有在官方文件中真正找到!是的,有很多用户可以投票。