2011-09-30 34 views
5

Tôi đang sử dụng mongoengine với MongoDB. Tôi phải tạo một Tài liệu trong đó bộ dữ liệu (merchant_id, order_id, event_type) phải là một khóa duy nhất.Mongoengine unique_with

Cho đến bây giờ, tôi đã luôn xử lý tính duy nhất bị giới hạn ở hai trường. Vì vậy, sau works-

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

Bây giờ, tôi đang cố gắng để làm điều này cho ba lĩnh vực -

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

Nhưng điều này không làm việc. Tôi không gặp lỗi trong mô-đun. Nhưng nếu tôi nhập dữ liệu như -

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

và sau đó cố gắng thêm dữ liệu khác với cùng merchant_idorder_id nhưng một khác nhau event_id, sau đó nó mang lại cho một lỗi về việc bị một chìa khóa trùng lặp.

Tôi cũng đã cố gắng:

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

tôi nhận được những gì các vấn đề được. Dường như khi bộ sưu tập của bạn đã được tạo, bạn không thể thay đổi khóa duy nhất. Vì vậy, trước đây tính duy nhất là trên hai lĩnh vực và sau đó tôi đã thay đổi nó thành ba lĩnh vực. Vì vậy, nó đã được lấy chìa khóa đầu tiên được xác định. Để khóa mới nhất được xác định có hiệu lực, người ta phải bỏ toàn bộ bộ sưu tập bằng cách sử dụng drop_collection(). Sau đó, nó hoạt động. – Siddharth

Trả lời

1

Nếu bạn muốn thay đổi các thông số một chỉ số hiện có, bạn phải thả các chỉ số đầu tiên và sau đó tạo lại nó. Tất nhiên bạn không thể tạo một chỉ mục duy nhất trên các bộ sưu tập có chứa các bản sao. Bạn phải loại bỏ các bản sao đầu tiên hoặc sử dụng tùy chọn tạo chỉ mục 'dropDups'.

5

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

meta = { 
    'indexes': [ 
     {'fields': ('merchant_id', 'order_id'), 'unique': True} 
    ] 
} 
Các vấn đề liên quan