2013-07-29 3 views
0

Так что я делаю простое приложение для голосования на пицце с Flask и Mongoengine. Вот класс для Проголосовали документа:MongoDB, 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

Почему бы не обновить поле с помощью $ addToSet, то это не имеет значения, если они голосовали более одного раза, так как они будут быть в избирательных комиссиях только один раз. Кроме того, выполните запрос на обновление, в котором для избирателей используется $ nin. – Ross

+0

@Ross может объяснить, что такое $ addToSet и $ nin? –

ответ

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) 
Смежные вопросы