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

时间:2011-02-17 22:19:53

标签: mongodb

在Mongo中有一个关于投票数据模型/更新查询的例子:
http://www.mongodb.org/display/DOCS/MongoDB+Data+Modeling+and+Rails#MongoDBDataModelingandRails-AtomicUpdates

但是我需要上下投票(基本上,一个人可以投票或投票)。此外,我希望选民能够改变主意,改变命运,反之亦然(因此选民名单和总数不合适)。

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

我看到两种可能性,要么做一个

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

'upvoters': [...], 'downvoters': [...]

但是我还不能对第一个进行更新查询,第二个看起来有点奇怪(虽然它可能只是我)。

2 个答案:

答案 0 :(得分:2)

使用第二个架构似乎更简单。

Document:  { name: "name",
             upvoters: [name1, name2, etc],
             downvoters: [name1, name2, etc],
           }

要获得总票数,您可以获得文档和使用 doc.upvoters.length-doc.downvoters.length (启动每个文件的upvoters和downvoters数组为[])

要在项目“c”上记录用户“x”的任何upvote,请执行以下操作:

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

这是原子的,即使你运行10次也有同样的功能。 它还使您不必检查“x”是否已经投票选择“c”以及哪种方式。

记录downvote只需反转它:

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

答案 1 :(得分:1)

第一个架构看起来很不错。第二个模式很难,因为当用户点击upvote而不是downvote时,你需要将userId添加到'downvoters',以'downvoters'并从'upvoters'中删除,反之亦然。

我认为投票不是某些文件的集合(假设它有问题)。

db.questions.update({votes.userId: .. },{ $set : { votes.$.vote : 1 } });//upvote
db.questions.update({votes.userId: .. },{ $set : { votes.$.vote : -1 } });//down

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

db.questions.update({_id: .. },{ $inc : { votesCount : 1 } }); //up vote
db.questions.update({_id: .. },{ $inc : { votesCount : -1 } }); // down vote

如果您需要将新用户添加到投票数组,请使用

Possitional operator.