Mongoengine unique_with - PullRequest
       5

Mongoengine unique_with

6 голосов
/ 30 сентября 2011

Я использую mongoengine с MongoDB. Я должен сделать документ, в котором кортеж (merchant_id, order_id, event_type) должен быть уникальным ключом.

До сих пор я всегда имел дело с тем, что уникальность ограничена двумя полями. Итак, следующие работы -

merchant_id = StringField(required = True)
order_id = StringField(required = True, unique_with = 'merchant_id')

Теперь я пытаюсь сделать это для трех полей -

merchant_id = StringField(required = True)
order_id =  StringField(required = True)
event_type = StringField(
    required = True,
    unique_with = ['merchant_id', 'order_id'])

Но это не работает. Я не получаю ошибку в модуле. Но если я введу данные как -

merchant_id = 'Merchant1'
order_id = 'Order1'
event_type = 'Event1'

, а затем попробуйте добавить другие данные с такими же merchant_id и order_id, но с другим event_id, тогда выдает ошибку о том, что является дублирующим ключом.

Я также пробовал:

merchant_id = StringField(required = True)
order_id =  StringField(required = True)
event_type = StringField(
    required = True,
    unique_with = ('merchant_id', 'order_id'))

Ответы [ 3 ]

7 голосов
/ 21 октября 2015

Вы можете указать индексы в метаданных класса

meta = {
    'indexes': [
        {'fields': ('merchant_id', 'order_id'), 'unique': True}
    ]
}
2 голосов
/ 02 января 2013

Если вы хотите изменить параметры существующего индекса, вы должны сначала удалить индекс, а затем воссоздать его. Конечно, вы не можете создать уникальный индекс для коллекций, которые содержат дубликаты. Либо вы должны сначала удалить дубликаты, либо использовать опцию создания индекса dropDups.

0 голосов
/ 13 января 2019

Убедитесь, что индексы созданы, иначе ни 'unique': True индексы, ни unique_with поля не будут работать.

meta = {
    'auto_create_index': True
}
...