2016-08-02 1 views
0

重複したキー・エラーが表示され、その理由がわかりません。マングース・ドゥー・キー

私は、次のスキーマがあります。私はこのコードで新しいユーザーを作成

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」の「ユーロ」が重複しています。それを修正するために '{unique:true}'属性を削除してください。 – chridam

答えて

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

そこからユニークなものを削除すれば、あなたはうまくいくでしょう。 Mongoはコレクションのためのユニークなキーをチェックします。あなたのケースでは、walletSchemaコレクションには同じ値がたくさんあるため、エラーが発生します。

0

currencyNameは一意に設定されているため、保存するユーザーごとに異なる必要があります。実際、このスキーマでは、同じ国の2人のユーザーを持つことさえできません。

これを避けるには、uniqueキーワードをスキーマから削除する必要があります。それは次のようになります。

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