اذهب إلى المحتوى
  • 0

ظهور الخطأ duplicate key error في mongodb

Tamim Fahed

السؤال

أقوم باستخدام mongoose للتعامل مع قاعدة بيانات mongodb، ولقد قمت بإنشاء هيكلية جدول المستخدم كالتالي:

var userSchema = new mongoose.Schema({
	info: {
        email : { type: String, require: true, unique: true },
        password: { type: String, require:true },
	}
});

var User = mongoose.model('User',userSchema);

module.exports = User;

وهذا هو كود إضافة مستند جديد:

user({'info.email' : req.body.email, 'info.password' : req.body.password}).save(function(error, result){
    if(error)
        res.send(error);
    else {
        res.send({"msg":"saved success"});
    }
});

ولكن عند الإضافة أحصل على الخطأ التالي:

{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.users.$email_1  dup key: { : null }"} 

مع العلم أنه ليس لدي أي بيانات متشابهة ضمن المجموعة، كيف يمكنني حل هذه المشكلة؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

بسبب وجود القيد unique على قيمة حقل البريد الالكتروني، تظهر الرسالة بسبب وجود أكثر من مستند له بريد الكتروني فارغ null. فبما أن الحقل مطلوب required وأيضاً فريد، لا يجوز تشابه قيمة هذا الحقل مع مستندات أخرى حتى لو كانت null.

حسب التوثيق الرسمي، عند وجود حقل له الخاصية unique وعند عدم إضافة أي قيمة لهذا الحقل يتم حفظ قيمة index له وهي null. والباني الخاص بـ index لهذه المجموعة سيفشل ويعيد الخطأ الذي تمت إعادته في حالتك.

لذلك يمكنك إضافة مايدعى بـ sparse index أو المفتاح المتناثر لتطبيق فلتر على القيم الفارغة null، وعدم التسبب في ظهور هذا الخطأ.

تطبيق المفتاح index على هذه الحقول وإعطائه القيمة unique يكون بالشكل التالي:

users.createIndex( { "info.email": 1 }, { unique: true } )

أما لتطبيق خاصية sparse index فهي بالشكل التالي:

users.createIndex( { "info.email": 1 }, { sparse: true } )

وعندها يستطيع sparse index التعامل مع عدة قيم null ولن يحصل الخطأ السابق.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...