2012-11-19 75 views
23

我有一個MongoDB的架構像這樣MongoError,ERR:E11000重複鍵錯誤

var User = new Schema({ 
    "UserName": { type: String, required: true }, 
    "Email": { type: String, required: true, unique: true }, 
    "UserType": { type: String }, 
    "Password": { type: String } 
}); 

我想創建一個新的用戶 這在的NodeJS使用貓鼬ODM 完成,這是創建代碼:

controller.createUser = function (req, res) { 

    var user = new models.User({ 
     "UserName": req.body.UserName.toLowerCase(), 
     "Email": req.body.Email.toLowerCase(), 
     "UserType": req.body.UserType.toLowerCase() 
    }); 
    models.User.findOne({ 'Email': user.Email }, function (err, olduser) { 
        if (!err) { 
         if (olduser) { 
          res.send({ 'statusCode': 409, 'statusText': 'Email Already Exists' }); 
         } 
         else if (!olduser) { 
          user.setPassword(req.body.Password); 
          user.save(function (err, done) { 
           if (!err) { 
            console.log(user); 
            res.send({ 'statusCode': 201, 'statusText': 'CREATED' }); 
           } 
           else { 
            res.send({ 'Status code': 500, 'statusText': 'Internal Server Error' }); 
           } 
          }); 
         } 
        } 
        else { 
         res.send({ 'statusCode': 500, 'statusText': 'ERROR' }); 
        } 
       }); 
}; 

的用於創建新的用戶,我給的屬性和值如下:

{ 
"UserName": "ann", 
"Email": "[email protected]", 
"UserType": "normaluser", 
"Password":"123456" 
} 

而且我得到的錯誤是這樣的:具有獨特constraint.Whenever

{"Status code":500,"statusText":"Internal Server Error","Error":{"name":"MongoError","err":"E11000 duplicate key error index: medinfo.users.$UserName_1 dup key: { : \"ann\" }","code":11000,"n":0,"connectionId":54,"ok":1}} 

我明白,這個錯誤是因爲用戶名是重複的,但我沒有設置用戶名我添加一個新行,我只需要電子郵件是唯一的,用戶名可以重複。如何實現這?

+0

也許它使用第一列作爲主鍵? – ManseUK

+0

這是一個純粹的猜測 - 我對這個問題更感興趣,而不是在這個問題上的專家 - 對不起 – ManseUK

+1

我不這麼認爲,具有相同用戶名的前一個對象具有「_id」屬性,我相信它是主要的鍵。像這樣的「用戶名」:「安」, 「電子郵件」:「安@ f。COM」, 「用戶類型」: 「normaluser」, 「密碼」: 「123456」 「_id」: 「5056d1c7e71c8a0c150003b3」 }' – dany

回答

23

@ManseUK可能是正確的,看起來像UserName是一個'鑰匙' - 在這種情況下是一個索引。 _id屬性是默認創建的「主」索引,但mongodb允許您擁有多個這樣的索引。

啓動一個mongo控制檯並運行medinfo.users.getIndexes()?某些東西必須在'UserName'上添加一個索引。

required: true不會這樣做,但您可能以前曾使用過其他設置並且索引尚未刪除?

+3

是,在指數上的用戶(集合)創建的,我用上市對用戶的指標'medinfo.users.getIndexes()'並刪除UserName上的索引,解決了這個問題。 – dany

0

我已經意識到我的數據結構正在改變 - 這就是versioning派上用場。

您可能需要獲得mongoose-version模塊,做了thing.remove({}, ...)甚至刪除集合:drop database with mongoose

我用RoboMongo一個管理工具(!我強烈推薦它),所以我剛去的和右從控制檯中點擊/丟棄收集。

如果有人知道如何輕鬆地在代碼中進行版本和/或刪除集合,請隨時在下面發表評論,因爲它肯定有助於此主題(和我:)。

6

應該有一個阻塞的索引。

你可以嘗試db.collection.dropIndex()方法

medinfo.users.dropIndexes()

0

我得到了類似的問題,在我的項目。我試圖清除所有文件,dup問題仍然不斷出現。在我放棄這個集合並重新啓動我的節點服務之前,它才起作用。