28

私はmongoose 3.0.3npmからこのスキーマを使用しています:

var schema = new Schema({

    _id: Schema.ObjectId,
    email: {type: String, required: true, unique: true}

});

既に db にあるメールを保存しようとすると、フィールドが省略されているとValidationErrorlike が返されることが予想されます。requiredただし、そうではありませんMongoError: E11000 duplicate key error index

これは検証エラーではありません (unique:true を削除しても発生します)。

理由はありますか?

4

5 に答える 5

12

これは予期される動作です

これunique: trueは、次のように mongodb でインデックスを設定することと同じです。

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

Mongoose を使用してこのタイプの検証を行うには (Mongoose はこの複雑な検証を呼び出します。たとえば、値が数値であると主張するだけではありません)、事前保存イベントに接続する必要があります。

mySchema.pre("save",function(next, done) {
    var self = this;
    mongoose.models["User"].findOne({email : self.email},function(err, results) {
        if(err) {
            done(err);
        } else if(results) { //there was a result found, so the email address exists
            self.invalidate("email","email must be unique");
            done(new Error("email must be unique"));
        } else {
            done();
        }
    });
    next();
});
于 2012-11-27T10:14:36.737 に答える
1

jsonへの単純な応答

try {
  let end_study_year = new EndStudyYear(req.body);
  await end_study_year.save();
   res.json({
    status: true,
    message: 'បានរក្សាទុក!'
   })
  }catch (e) {
   res.json({
   status: false,
   message: e.message.toString().includes('duplicate') ? 'ទិន្នន័យមានរួចហើយ' : e.message.split(':')[0] // check if duplicate message exist
  })
 }
于 2020-09-19T09:56:27.043 に答える
1

古い質問に答えてすみません。テストした後、これらの答えを見つけることができて良かったので、私の経験を述べます. 上位の回答はどちらも素晴らしく、正しいものです。次のことを覚えておいてください。

  • ドキュメントが新しい場合は、count が 0 より大きいかどうかを検証できます。これは一般的な状況です。
  • ドキュメントが新しくなく、uniqueフィールドが変更されている場合は、0 でも検証する必要があります。
  • ドキュメントが新しくなく、変更されていない場合は、先に進んでください。

コードで作成したものは次のとおりです。

UserSchema.path('email').validate(async function validateDuplicatedEmail(value) {
    if (!this.isNew && !this.isModified('email')) return true;

    try {
        const User = mongoose.model("User");

        const count = await User.countDocuments({ email: value });
        if (count > 0) return false;

        return true;
    }
    catch (error) {
        return false;
    }
}, "Email already exists");


于 2022-01-15T13:51:31.847 に答える