2015-02-23 62 views
1

我有瓶+ MongoEngine創建了一個應用程序,我有這樣的一個「用戶文件」:瓶+ MongoEngine:設置MongoEngine文檔字段作爲唯一的預現有文檔

class User(db.Document): 
    username = db.StringField(max_length=MAX_USERNAME_CHARS) 
    name = db.StringField(max_length=70) 
    #[...] 
    email = db.EmailField(max_length=50, required=True) 
#[...] 
meta = { 
    'indexes': ['-created_at', 'email'], 
    'ordering': ['-created_at'] 
} 
#[...] 

到目前爲止我一直在檢查控制器中的「用戶名」和「電子郵件」的重複,但我仍然有一些用戶在這些重複的字段,現在我想設置此字段(「用戶名」和「電子郵件」)爲唯一的,不可空並且需要。

我正在尋找的文件,現在我知道我能做到這一點絲毫此聲明:

email = db.EmailField(max_length=50, required=True, unique=True) 

但如果該文件是之前創建MongoEngine不要再設置此。

所以,我從現在開始尋找一種方法(一旦解決了已經重複的問題)不會重複出現重複字段。

它在生產中的應用程序,有很多用戶註冊。 我可以使用mongo控制檯設置一些索引或一些。

回答

1

首先,在嘗試任何事情之前,做一個完整的數據庫備份

您將希望在電子郵件字段上創建唯一索引以強制其唯一性。如果沒有重複的電子郵件,則查詢將成功。如果數據庫中已存在重複的電子郵件地址,則會出現錯誤(這不應該是這種情況)。

輸入蒙戈控制檯和創建索引:

db.YOUR_COLLECTION.ensureIndex({ email: 1 }, { unique: true }) 

這產生在email領域的升序指數(因此1; -1將表示降序索引)。這使得搜索和分類電子郵件的速度更快。它也使得它獨一無二(這就是你的實際目標!),所以試圖插入帶有現有電子郵件的文檔的查詢將失敗。

有關更多詳細信息,請參見官方MongoDB站點上的this article