所以我正在用Flask和Mongoengine制作一个简单的披萨投票应用程序。 这是投票类文档:
class Votes(db.Document):
# reference to a date the vote started
vote = db.ReferenceField(VoteArchive)
# reference to one kind of pizza
pizza = db.ReferenceField(Pizza)
# list of references to users that voted for that pizza
voters = db.ListField(db.ReferenceField(User))
我无法弄清楚的是如何让“选民”中的引用变得独一无二。 不是整个字段,而是该列表中的项目不再重复,因此一个用户只能投票一次披萨。
目标是禁止一位用户投票两次披萨。
有什么想法吗?
答案 0 :(得分:2)
处理此问题的最佳方法是使用MongoDB的本机功能。您可以使用两个运算符:
1)使用$nin查询我已经完成的任何投票,并在查询匹配时插入:
updated = Votes.objects(pizza=Spicy,
vote=FiveStar,
nin__voters=Rozza).update(push__voters=Rozza)
2)使用$addToSet只有当值不在数组中时才向数组添加值。我们也可以在这里添加upsert
标志,如果对象不存在,我们将插入:
updated = Votes.objects(pizza=Spicy,
vote=FiveStar,
upsert=True).update(addToSet__voters=Rozza)