2011-09-30 14 views
5

Estoy usando mongoengine con MongoDB. Tengo que hacer un documento en el que la tupla (merchant_id, order_id, event_type) tenga que ser una clave única.Mongoengine unique_with

Hasta ahora, siempre he tratado la singularidad estando limitada a dos campos. Así que la siguiente obras-

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

Ahora, que estoy tratando de hacer esto por tres campos -

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

Pero esto no funciona. No obtengo un error en el módulo. Pero si entro de datos como -

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

y luego tratar de añadir otros datos con el mismo merchant_id y order_id sino una diferente event_id, entonces se da un error acerca de ser un duplicado de la llave.

también he intentado:

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

Tengo lo que era el problema. Parece que una vez que se ha realizado su colección, no puede cambiar la clave única. Entonces, previamente, la singularidad estaba en dos campos y luego la cambié a tres campos. Así que estaba tomando la primera clave definida. Para que la última clave definida surta efecto, debe eliminarse la colección mediante drop_collection(). Entonces funciona. – Siddharth

Respuesta

1

Si desea modificar los parámetros de un índice existente, usted tiene que quitar el índice primero y luego volver a crearlo. Por supuesto, no puede crear un índice único en las colecciones que contienen duplicados. O bien, primero debe eliminar los duplicados o usar la opción de creación de índices 'dropDups'.

5

Puede especificar indexes en el dict meta de la clase

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