1

所以我正在用 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))

我无法弄清楚的是如何使“选民”中的引用变得独一无二。不是整个字段,而是该列表中的项目不要重复,因此一个用户只能为一个披萨投票一次。

目标是禁止一个用户为披萨投票两次。

有任何想法吗?

4

1 回答 1

3

处理这个问题的最好方法是使用 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)
于 2013-07-29T13:12:40.020 回答