2011-09-30 55 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} 
    ] 
}