2015-08-09 49 views
1

當新用戶嘗試在我目前申請註冊,驗證過程的一部分,是要檢查的數據庫(MongoDB的)的用戶名和電子郵件是否已被使用。這個驗證過程是我的應用程序邏輯的一部分。推薦的方法,以避免重複的用戶名在MongoDB中

我想知道是否有可能/最好嘗試保存用戶沒有這些驗證檢查,並讓DB檢測到錯誤(由於重複的電子郵件地址或用戶名),我會再處理。

如果是這樣,我怎麼能處理這些錯誤,這樣我可以處理每一個(用戶名和電子郵件)。東西的方式...

err := c.Database.C("users").Insert(&user); 
if err != nil { 
    //check whether issue is with email or username or both 
} 
+0

在所有誠實,這取決於你真正想在這裏做。屬性上的「唯一」索引會導致插入嘗試出現錯誤,如果這些值存在組合,則可以「處理」該錯誤。另一方面,如果您希望能夠解決「獨特」屬性,並可能對匹配執行某些操作或以其他方式「插入」新數據,則可以使用[「upsert」](http://docs.mongodb.org/手動/參考/方法/ db.collection.update /#upsert-option)行爲可能是你需要的。所以這一切都是關於你打算如何在發生「重複」時作出反應。 –

+0

假設這兩個屬性是索引的,我沒有看到*,即在等待重複錯誤和手動驗證之間有很大區別。這裏需要考慮的一點是代碼結構的可讀性/邏輯性 - 爲什麼當您可以防止它首先發生時檢測/預期錯誤? – Lix

+0

雖然可能忽略不計 - 我不得不兩次查看電子郵件是否存在用戶名,但我的思考很有效。 – tommyd456

回答

0

您可以避免與unique index重複。要在蒙戈外殼這樣的指標,使用方法:

db.collection.createIndex({ name: 1 }, { unique: true }); 
db.collection.createIndex({ email: 1 }, { unique: true }); 

當你再插入違反唯一性約束的文檔時,您將收到一個錯誤的結果。不幸的是,您將不得不解析錯誤消息的文本,以確定哪個索引被違反。 err.errmsg將在這個格式的字符串:

insertDocument :: caused by :: 11000 E11000 duplicate key error index: [index] dup key: [value]"

注意唯一索引很怪的。唯一索引將「字段不存在」視爲單獨的唯一值。所以它只允許集合中缺少字段的一個文檔。因此,請確保在將文檔發送到數據庫之前填寫所有必填字段。

1

猜唯一索引應該爲你工作(如果upinsert不適合的需要)。 在蒙戈命令設置這些索引工作正常,另一種方式是在你的代碼中使用mgo.EnsureIndex,一個簡單的例子可以在https://gist.github.com/border/3489566找到。 根據官方文檔,一旦索引成功創建,除非索引被刪除,否則EnsureIndex不會聯繫服務器。

一旦EnsureIndex返回成功,對同一個>索引的以下請求將不會與服務器聯繫,除非使用Collection.DropIndex>刪除相同索引或調用Session.ResetIndexCache。