Mongodb Mongo数据建模/投票更新(上下)

Mongodb Mongo数据建模/投票更新(上下),mongodb,Mongodb,Mongo中有一个投票数据模型/更新查询示例: 然而,我需要上下两票(基本上,一个人可以投赞成票,也可以投反对票)。此外,我希望选民能够改变主意,将upvote改为downvote,反之亦然(因此选民名单和总人数不合适) 最好的数据模型和相应的更新调用是什么 我看到两种可能性,一种是 'votes': [{ 'user_id' : ... , 'vote': ±1 }] 或 但是我还不能对第一个模式进行更新查询,第二个看起来有点奇怪(尽管可能只有我一个人)。第一个模式看起来不错。第二种模式很

Mongo中有一个投票数据模型/更新查询示例:

然而,我需要上下两票(基本上,一个人可以投赞成票,也可以投反对票)。此外,我希望选民能够改变主意,将upvote改为downvote,反之亦然(因此选民名单和总人数不合适)

最好的数据模型和相应的更新调用是什么

我看到两种可能性,一种是

'votes': [{ 'user_id' : ... , 'vote': ±1 }]


但是我还不能对第一个模式进行更新查询,第二个看起来有点奇怪(尽管可能只有我一个人)。

第一个模式看起来不错。第二种模式很难实现,因为当用户单击upvote而不是downvote时,您需要将userId添加到“UpVorters”中,将其添加到“DownVorters”中,然后从“UpVorters”中删除,反之亦然

我想这是一个文件的集合(假设它有问题)

似乎您需要在问题集合中创建额外字段来计算向上/向下投票的总和:

db.questions.update({_id: .. },{ $inc : { votesCount : 1 } }); //up vote
db.questions.update({_id: .. },{ $inc : { votesCount : -1 } }); // down vote
如果需要将新用户添加到投票数组,请使用


使用第二种模式似乎简单得多

Document:  { name: "name",
             upvoters: [name1, name2, etc],
             downvoters: [name1, name2, etc],
           }
要获得总票数,您可以获取文档并使用 doc.upvorters.length-doc.downvorters.length (在每个文档开始时,UpVorters和DownVorters数组为[])

要记录用户“x”对“c”项的任何追加投票,只需执行以下操作:

这是原子的,它有做同样事情的优势,即使你运行它10次。 它还使您不必检查“x”是否已经投票给“c”以及投票的方式

要记录否决票,只需将其反转:

db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})

如果我没记错的话,MongoDB文档中给出的示例将允许-1(而不仅仅是+1)。。。你试过了吗?或者你需要知道下降票和上升票的确切比例吗?评论不错。是的,原因是我想让人们改变主意,在之前投赞成票的地方投反对票,而mongodb的例子不允许这样做。将此添加到问题文本中。值得注意的是,对于已经进行了向上投票的用户,递减-1不会导致向下投票,反之亦然,无论OP决定使用哪个模式。分别为-2或+2。如果用户已在集合中,则此更新有效,但如果用户未在集合中,则不匹配。我应该先执行$ne/$push命令吗?是的,确定首先需要检查用户是否存在,以及用户中是否不存在$push,否则更新。@Anthony Jack:同意,但是-2和+2也不起作用。例如,如果您需要votedown,则需要检查用户是否有voteup以解决某些问题,而不是voteup是否存在,请使用{$inc:-2}else{$inc:-1},以及{$inc:2}else{$inc:1}For voteupI,我认为我还不需要count字段,并且更新本身可以正确地处理意见更改,因此我接受答案。谢谢
Document:  { name: "name",
             upvoters: [name1, name2, etc],
             downvoters: [name1, name2, etc],
           }
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})