MongoDB,MongoEngine:唯一列表项

时间:2013-07-29 10:48:09

标签: python mongodb flask mongoengine

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

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

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

有什么想法吗?

1 个答案:

答案 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)