2013-02-21 26 views
5

Tôi muốn tạo một bảng trong đó hai trường của nó kết hợp để tạo thành một trường chỉ mục. Mã Python của tôi để tạo bảng như sau. Điều tôi muốn làm là tạo các trường kết hợp course_namegroup_name duy nhất để không thể tạo hai nhóm với cùng một số course_namegroup_name. Có thể ai đó xin vui lòng giúp tôi với điều này?Cách tạo một tập hợp các trường duy nhất trong Mongodb bằng Python

class SocialGroup(Document): 
    timestamp = DateTimeField(default=datetime.now) 
    course_name = StringField() 
    group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None") 

Trả lời

7

Bạn có thể chỉ định indexes trong meta dict của lớp:

class SocialGroup(Document): 
    timestamp = DateTimeField(default=datetime.now) 
    course_name = StringField() 
    group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None") 
    meta = { 
     'indexes': [ 
      {'fields': ('course_name', 'group_name'), 'unique': True} 
     ] 
    } 
0

Từ: http://docs.mongoengine.org/guide/defining-documents.html#uniqueness-constraints

Bạn cũng có thể chỉ định nhiều lĩnh vực ràng buộc duy nhất bằng cách sử dụng unique_with, mà có thể là tên trường đơn hoặc danh sách hoặc bộ tên trường

Trong trường hợp của bạn:

class SocialGroup(Document): 
    timestamp = DateTimeField(default=datetime.now) 
    course_name = StringField() 
    group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None", 
          unique_with='course_name') 

Hoặc phức tạp hơn:

group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None", 
         unique_with=['course_name', 'another_field', 'more_field']) 
Các vấn đề liên quan