2016-08-02 53 views
0

我得到一個重複的鍵錯誤,不知道爲什麼。Mongoose dup鍵

我有以下模式:

var walletSchema = mongoose.Schema({ 
    currencyName : {type : String, required : true, unique : true}, 
    amount : {type : Number, default : 0} 
}, {strict : false}); 

// define the schema for our user model 
var userSchema = mongoose.Schema({ 
    local : { 
     username : { type: String, required: true, unique: true }, 
     password : { type: String, required: true, unique : true }, 
     email  : { type: String, required: true, unique: true }, 
     country  : { type: String, required: true }, 
     inventory : { 
      food : { type : Number, default : 0}, 
      energyDrinks : { type : Number, default : 0 } 
     }, 
     wallet : [walletSchema], 
     lastAttackedAt : { type: Date, default: Date.now }, 
     lastJobChange : {type: Date, default: '03/30/1988' }, 
     lastWorked : {type: Date}, 
     referredBy : {type : String, default : 'Admin'}, 
     energy  : { type: Number, default: 100 }, 
     energyUpdatedAt : { type : Date, default: Date.now }, 
     resetPasswordToken: String, 
     resetPasswordExpires: Date 
    } 
},{timestamps : true}); 

我創建這個代碼的新用戶:

... 
newUser.local.username = capitalizeUser(username); 
newUser.local.password = newUser.generateHash(password); 
newUser.local.email = req.body.email; 
newUser.local.country = req.body.country; 
newUser.local.wallet.push({ 
     // Create the default currencies 
     currencyName: 'Euro', 
    }, { 
     currencyName: 'Gold', 
    }, { 
     currencyName: result.countryCurrency 
    } 

); 
// save the user 
newUser.save(function(err) { 
    if (err) 
     throw err; 
    return done(null, newUser); 
}); 

一切正常,第一個用戶。然而,如果我試圖讓其他用戶,我得到MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index: xyz.users.$local.wallet.currencyName_1 dup key: { : "Euro" }

爲什麼會發生這種情況,是不是每個用戶都有自己的wallet?我應該如何處理它,請記住,每個用戶有大約230種貨幣可供使用。

+1

由於錯誤狀態,您有一個重複的'currencyName''' Euro''。刪除「{unique:true}」屬性來修復它。 – chridam

回答

1
currencyName : {type : String, required : true} 

從那裏刪除獨特的,你會很好去。 Mongo檢查收集的唯一密鑰。在你的情況下,walletSchema集合會有很多相同的值,所以這就是爲什麼它會給出錯誤。

0

由於您的貨幣名稱已被設置爲唯一,因此您必須爲每個保存的用戶設置不同的名稱。事實上,你在這個模式下,你甚至不會有來自同一個國家的兩個用戶。

因此,爲了避免這種情況,您需要從您的模式中刪除唯一關鍵字並完成。它看起來像這樣。

var walletSchema = mongoose.Schema({ 
    currencyName : {type : String, required : true}, 
    amount : {type : Number, default : 0} 
}, {strict : false});