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的帖子,这些帖子还没有被特定用户投票。问题是:我无法为每个特定用户创建视图,因此我必须设置一个视图来过滤帖子如果您有许多用户可以投票,您不应该使用您的方法,因为要添加投票,您需要:
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:
function(){
if (meta.type === "json" && doc.type === "vote"){
emit(doc.votedFor, null);
}
}
然后,如果您想计算投票数(总和),只需使用\u count
作为reduce函数
PS:在我的应用程序中,我们使用这种方法来计算视频的浏览量:一个称为“fast_clip_view”的键值用于显示网站上的信息,另一个详细的clipview使用userId
、clipId
和时间戳
来显示详细的统计信息
顺便说一下,如果您需要“投票前十名”之类的内容,请参考此项。如果您有许多用户可以投票,您不应该使用您的方法,因为要添加投票,您需要:
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:
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,嗯,这让我很困惑:我以为我应该避免像那样分离对象。那就更好了。但我真的需要一个有这些东西的指南/教程!有很多(简单的)事情不清楚,我没有在官方文件中真正找到!是的,有很多用户可以投票。