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

السؤال

نشر

أقوم باستخدام 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...