2012-11-19 7 views
23

मैं इसMongoError, अरे: E11000 नकल कुंजी त्रुटि

var User = new Schema({ 
    "UserName": { type: String, required: true }, 
    "Email": { type: String, required: true, unique: true }, 
    "UserType": { type: String }, 
    "Password": { type: String } 
}); 

की तरह एक MongoDB स्कीमा मैं यह नेवला ODM का उपयोग कर NodeJS में किया जाता है एक नया उपयोगकर्ता बनाने के लिए कोशिश कर रहा हूँ है और यह है बनाने के लिए कोड:

controller.createUser = function (req, res) { 

    var user = new models.User({ 
     "UserName": req.body.UserName.toLowerCase(), 
     "Email": req.body.Email.toLowerCase(), 
     "UserType": req.body.UserType.toLowerCase() 
    }); 
    models.User.findOne({ 'Email': user.Email }, function (err, olduser) { 
        if (!err) { 
         if (olduser) { 
          res.send({ 'statusCode': 409, 'statusText': 'Email Already Exists' }); 
         } 
         else if (!olduser) { 
          user.setPassword(req.body.Password); 
          user.save(function (err, done) { 
           if (!err) { 
            console.log(user); 
            res.send({ 'statusCode': 201, 'statusText': 'CREATED' }); 
           } 
           else { 
            res.send({ 'Status code': 500, 'statusText': 'Internal Server Error' }); 
           } 
          }); 
         } 
        } 
        else { 
         res.send({ 'statusCode': 500, 'statusText': 'ERROR' }); 
        } 
       }); 
}; 

नई उपयोगकर्ता बनाने के लिए, मैं गुण और मूल्यों दे रहा हूँ इस प्रकार है:

0,123,516 इस तरह
{ 
"UserName": "ann", 
"Email": "[email protected]", 
"UserType": "normaluser", 
"Password":"123456" 
} 

और मैं हो रही है त्रुटि: अद्वितीय constraint.Whenever साथ उपयोगकर्ता नाम

{"Status code":500,"statusText":"Internal Server Error","Error":{"name":"MongoError","err":"E11000 duplicate key error index: medinfo.users.$UserName_1 dup key: { : \"ann\" }","code":11000,"n":0,"connectionId":54,"ok":1}} 

मैं समझता हूँ क्योंकि उपयोगकर्ता नाम दोहराया गया है इस त्रुटि है, लेकिन मैं सेट नहीं किया है मैं एक नई पंक्ति जोड़ना , मुझे अद्वितीय होने के लिए केवल ईमेल की आवश्यकता है, उपयोगकर्ता नाम को दोहराया जा सकता है यह प्राप्त करने के लिए कहां ??

+0

शायद यह प्राथमिक कुंजी के रूप में पहले कॉलम का उपयोग कर रहा है? – ManseUK

+0

यह एक शुद्ध अनुमान था - इस विषय में एक विशेषज्ञ होने के बजाय प्रश्न में अधिक दिलचस्पी है - क्षमा करें – ManseUK

+1

मुझे ऐसा नहीं लगता है, पिछली वस्तु वाले उपयोगकर्ता नाम में एक "_id" विशेषता है, जो मुझे लगता है कि प्राथमिक है कुंजी। इस '{ "उपयोगकर्ता नाम": "एन", "ईमेल": "एन @ एफ।कॉम ", " उपयोगकर्ता टाइप ":" सामान्य उपयोगकर्ता "," पासवर्ड ":" 123456 " " _id ":" 5056d1c7e71c8a0c150003b3 " }' – dany

उत्तर

23

@ManseUK शायद सही है, ऐसा लगता है कि उपयोगकर्ता नाम एक 'कुंजी' है - इस मामले में एक सूचकांक। _id विशेषता "प्राथमिक" अनुक्रमणिका है जो डिफ़ॉल्ट रूप से बनाई गई है, लेकिन मोंगोडब आपको इनमें से कई को प्राप्त करने की अनुमति देता है।

एक मोंगो कंसोल शुरू करें और medinfo.users.getIndexes() चलाएं? कुछ ने 'UserName' पर एक इंडेक्स जोड़ा होगा।

required: true ऐसा नहीं करेगा, लेकिन हो सकता है कि आपने पहले अन्य सेटिंग्स के साथ खेला हो और इंडेक्स को हटाया नहीं गया हो?

+3

हां, उपयोगकर्ताओं (संग्रह) पर एक अनुक्रमणिका बनाई गई थी, मैंने उपयोगकर्ताओं पर इंडेक्स का उपयोग किया 'medinfo.users.getIndexes()' और उपयोगकर्ता नाम पर इंडेक्स को हटा दिया। इस मुद्दे को हल किया गया। – dany

0

मुझे जो एहसास हुआ था वह यह है कि मेरे डेटा-स्ट्रक्चर बदल रहे थे - यह वह जगह है जहां versioning काम में आता है।

आप एक thing.remove({}, ...) करना या यहां तक ​​कि संग्रह ड्रॉप, एक mongoose-version मॉड्यूल प्राप्त करने की आवश्यकता हो सकता है: drop database with mongoose

मैं एक व्यवस्थापक उपकरण के लिए RoboMongo का उपयोग करें (! और मैं अत्यधिक यह सलाह देते हैं) तो मैं बस में और दाएं चला गया कंसोल से क्लिक/गिराए गए संग्रह।

किसी को भी आसानी से संस्करण और/या कोड के भीतर से एक संग्रह ड्रॉप करने लिए, नीचे एक टिप्पणी पोस्ट करने के रूप में यह निश्चित रूप से इस सूत्र में मदद करता है के लिए स्वतंत्र महसूस जानता है (और मैं :))।

6

अवरुद्ध करने वाली एक अनुक्रमणिका होनी चाहिए।

आप db.collection.dropIndex() विधि

medinfo.users.dropIndexes()

0

मैं अपने प्रोजेक्ट पर समान मुद्दा मिल गया कोशिश कर सकते हैं। मैंने सभी दस्तावेजों को साफ़ करने की कोशिश की और डुप्ली समस्या अभी भी पॉप-अप रहती है। जब तक मैंने इस संग्रह को छोड़ दिया और मेरी नोड सेवा को फिर से शुरू नहीं किया, यह अभी काम किया।