2011-09-30 78 views
5

我在MongoDB中使用了mongoengine。我必須創建一個文檔,其中元組(merchant_id,order_id,event_type)必須是唯一鍵。直到現在,我一直處理的唯一性限於兩個領域。所以下面的工程─Mongoengine unique_with

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_idorder_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

我得到了什麼問題。 看來,一旦你的收藏已經完成,你不能改變唯一的關鍵。因此,以前的唯一性是在兩個領域,然後我將其改爲三個領域。所以它正在確定第一個關鍵。 要使定義的最新鍵生效,必須使用drop_collection()完​​全刪除集合。 然後它工作。 – Siddharth

回答

1

如果要修改現有指標的參數,你必須先刪除索引,然後重新創建它。當然,您不能在包含重複項的集合上創建唯一索引。您必須先刪除重複項,或使用'dropDups'索引創建選項。

5

您可以在類的元字典指定indexes

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