我正在尝试为简单的投票系统创建一个MongoDB数据库。如果我要绘制一个模式,那么它看起来像这样:
User {
name: String
, email: String
}
Vote {
message: String
, voters: [ObjectId(User._id)]
}
当有很多选民投票时,我对这个设计有一些疑问:
答案 0 :(得分:1)
我会在架构中添加一些冗余,以避免您提到的一些潜在问题。我假设你想1)快速计算投票数量和2)确保用户不能投票两次。
实现此目的的一种方法是保留用户列表和投票数,并在更新查询中添加一个子句,确保仅在用户的ID不在选民列表中时才添加投票:
var query = {_id: xyz, voters: {$ne: user_id}
var update = {$inc: {votes: 1}, $push: {voters: user_id}}
db.votes.update(query, update, true)
(最后一个参数是upsert
,这是Mongo的一个非常好的功能)
然后,如果要显示投票数,可以将结果的属性限制为votes
属性:
db.votes.find({_id: xyz}, {votes: true})
您可以在此处找到或多或少的完整描述:http://cookbook.mongodb.org/patterns/votes/
答案 1 :(得分:0)