在Mongo中有一个关于投票数据模型/更新查询的例子:
http://www.mongodb.org/display/DOCS/MongoDB+Data+Modeling+and+Rails#MongoDBDataModelingandRails-AtomicUpdates
但是我需要上下投票(基本上,一个人可以投票或投票)。此外,我希望选民能够改变主意,改变命运,反之亦然(因此选民名单和总数不合适)。
最佳数据模型和相应的更新调用是什么?
我看到两种可能性,要么做一个
'votes': [{ 'user_id' : ... , 'vote': ±1 }]
或
'upvoters': [...], 'downvoters': [...]
但是我还不能对第一个进行更新查询,第二个看起来有点奇怪(虽然它可能只是我)。
答案 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
如果您需要将新用户添加到投票数组,请使用