2011-09-30 12 views
5

Sto usando mongoengine con MongoDB. Devo creare un documento in cui la tupla (merchant_id, order_id, event_type) deve essere una chiave univoca.Mongoengine unique_with

Fino ad ora, ho sempre avuto a che fare con l'univocità limitata a due campi. Così il seguente works-

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

Ora, io sto cercando di fare questo per tre campi -

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

Ma questo non funziona. Non ricevo un errore nel modulo. Ma se entro dati -

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

e poi provo ad aggiungere un altro dato con la stessa merchant_id e order_id ma un diverso event_id, allora dà un errore di essere una chiave duplicata.

Ho anche provato:

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

ho ottenuto quello che era il problema. Sembra che una volta creata la tua collezione, non puoi cambiare la chiave univoca. Quindi in precedenza l'unicità era su due campi e poi l'ho cambiato in tre campi. Quindi stava prendendo la prima chiave definita. Affinché l'ultima chiave definita abbia effetto, è necessario eliminare completamente la raccolta utilizzando drop_collection(). Quindi funziona. – Siddharth

risposta

1

Se si desidera modificare i parametri di un indice esistente, è necessario eliminare l'indice e poi ricrearlo. Ovviamente non è possibile creare un indice univoco su raccolte che contengono duplicati. O è necessario rimuovere prima i duplicati oppure utilizzare l'opzione di creazione dell'indice "dropDups".

5

È possibile specificare indexes nella meta dict della classe

meta = { 
    'indexes': [ 
     {'fields': ('merchant_id', 'order_id'), 'unique': True} 
    ] 
} 
Problemi correlati