E11000 डुप्लिकेट कुंजी त्रुटि सूचकांक mongodb mongoose में


228

मॉडल userमें मेरा स्कीमा निम्नलिखित है user.js-

var userSchema = new mongoose.Schema({
    local: {
        name: { type: String },
        email : { type: String, require: true, unique: true },
        password: { type: String, require:true },
    },
    facebook: {
        id           : { type: String },
        token        : { type: String },
        email        : { type: String },
        name         : { type: String }
    }
});

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

module.exports = User;

यह मैं अपने नियंत्रक में इसका उपयोग कर रहा हूं -

var user = require('./../models/user.js');

इस तरह से मैं इसे db में सेव कर रहा हूँ -

user({'local.email' : req.body.email, 'local.password' : req.body.password}).save(function(err, result){
    if(err)
        res.send(err);
    else {
        console.log(result);
        req.session.user = result;
        res.send({"code":200,"message":"Record inserted successfully"});
    }
});

त्रुटि -

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

मैंने db संग्रह की जाँच की और ऐसी कोई डुप्लिकेट प्रविष्टि मौजूद नहीं है, मुझे बताएं कि मैं क्या गलत कर रहा हूँ?

FYI करें - req.body.emailऔर req.body.passwordमान प्राप्त कर रहे हैं।

मैंने इस पोस्ट को भी चेक किया लेकिन कोई STACK LINK की मदद नहीं ली

अगर मैंने पूरी तरह से हटा दिया है तो यह दस्तावेज़ को सम्मिलित करता है, अन्यथा यह "डुप्लिकेट" त्रुटि को फेंक देता है यहां तक ​​कि मेरे पास स्थानीय प्रविष्टि भी है।


1
एक ही त्रुटि थी! विकास के दौरान हमने ऑटो इंडेक्सिंग को अक्षम कर दिया और स्कीमा नाम / कुंजी का उपयोग कर रहे थे। हमने बाद में इसके बजाय टाइटलकेस का उपयोग करने का फैसला किया, लेकिन हमारे इंडेक्स नामों को अपडेट करने में विफल रहा (जैसे: टाइटलकेस के बजाय टाइटलकेस)। इसलिए जब हमने अनुक्रमण को सक्षम किया, तो हमें यह त्रुटि मिली। इसका पता लगाने के लिए थोड़ा समय लिया। आप यह सुनिश्चित करना चाहेंगे कि सभी नाम / कुंजियाँ बिल्कुल हर जगह नाम हों।
19

6
मेरे पास एक ही त्रुटि थी और मॉडल को सेट करने unique: falseका कोई प्रभाव नहीं था। मुझे एहसास हुआ कि मुझे पहले टेबल को गिराना था और फिर यह काम करेगा। आप जैसे seomthing कर सकते हैं db.whateverthecollection.drop({})। सावधान रहें, यह संग्रह को हटा देता है।
पेरे

1
_id: mongoose.Types.ObjectId क्योंकि अद्वितीय आईडी आवश्यक है
मयंक पांडव

जवाबों:


239

त्रुटि संदेश कह रहा है कि nullईमेल के रूप में पहले से ही एक रिकॉर्ड है । दूसरे शब्दों में, आपके पास पहले से ही एक ईमेल पते के बिना एक उपयोगकर्ता है।

इसके लिए प्रासंगिक दस्तावेज:

यदि किसी दस्तावेज़ में किसी अनन्य अनुक्रमणिका में अनुक्रमित फ़ील्ड के लिए मान नहीं है, तो अनुक्रमणिका इस दस्तावेज़ के लिए एक शून्य मान संग्रहीत करेगी। अद्वितीय बाधा के कारण, MongoDB केवल एक दस्तावेज़ की अनुमति देगा जिसमें अनुक्रमित फ़ील्ड का अभाव है। यदि अनुक्रमित फ़ील्ड के लिए एक मान के बिना एक से अधिक दस्तावेज़ हैं या अनुक्रमित फ़ील्ड को याद नहीं कर रहा है, तो इंडेक्स बिल्ड डुप्लिकेट त्रुटि के साथ विफल हो जाएगा।

आप अद्वितीय सूचकांक से इन अशक्त मूल्यों को फ़िल्टर करने और त्रुटि से बचने के लिए अनूठे अवरोध को विरल सूचकांक के साथ जोड़ सकते हैं।

अद्वितीय अनुक्रमित

स्पार्स इंडेक्स में केवल उन दस्तावेज़ों के लिए प्रविष्टियाँ होती हैं जिनके पास अनुक्रमित फ़ील्ड है, भले ही इंडेक्स फ़ील्ड में एक शून्य मान हो।

दूसरे शब्दों में, एक स्पैर्स इंडेक्स कई दस्तावेजों के साथ ठीक है जिसमें सभी nullमान हैं।

विरल सूचकांक


टिप्पणियों से:

आपकी त्रुटि कहती है कि कुंजी का नाम दिया गया है mydb.users.$email_1जिससे मुझे संदेह है कि आपके पास दोनों पर एक सूचकांक है users.emailऔर users.local.email(पूर्व में पुराना और अप्रयुक्त समय पर)। मानगो मॉडल से किसी फ़ील्ड को हटाने से डेटाबेस प्रभावित नहीं होता है। साथ की जाँच करें mydb.users.getIndexes()ऐसा तो नहीं है और मैन्युअल रूप से अवांछित सूचकांक को दूर mydb.users.dropIndex(<name>)


1
मैं सिर्फ उस अशक्त दस्तावेज़ को हटा दिया और यह काम किया :) +1 .. मदद के लिए
Trialcoder

70
आपकी त्रुटि कहती है कि कुंजी का नाम दिया गया है mydb.users.$email_1जिससे मुझे संदेह है कि आपके पास दोनों पर एक सूचकांक है users.emailऔर users.local.email(पूर्व में पुराना और अप्रयुक्त समय पर)। मानगो मॉडल से किसी फ़ील्ड को हटाने से डेटाबेस प्रभावित नहीं होता है। साथ की जाँच करें mydb.users.getIndexes()ऐसा तो नहीं है और मैन्युअल रूप से अवांछित सूचकांक को दूर mydb.users.dropIndex(<name>)
रिकएन

17
या db.users.dropIndexes()यदि आप कई अनुक्रमणिका परिवर्तन कर रहे हैं, तो उपयोग करें
cs_stackX

1
यह मेरे लिए एक मुद्दा था जब मैं नए उपयोगकर्ताओं के लिए उपयोगकर्ता नाम सेट किए बिना mongoose प्लगइन पासपोर्ट-स्थानीय-mongoose का उपयोग कर रहा था।
बोना

1
यह एक मामला या परिप्रेक्ष्य या शायद राय भी है, @titoih - शून्य या किसी अन्य की तरह एक मूल्य का अभाव है या यह एक विशेष मामला है? "ए @ बीसी" और "ए बीसी" समान हैं, क्या "कुछ भी नहीं" और "कुछ भी नहीं" समान हैं? गैर-विरल सूचकांक के साथ उत्तर MongoDB में "हां" है। अन्य डेटाबेस (जैसे MySQL) "नहीं" कहेंगे।
रिकएन

64

यदि आप अभी भी अपने विकास के माहौल में हैं, तो मैं पूरे db को छोड़ दूंगा और अपने नए स्कीमा के साथ शुरू करूंगा।

कमांड लाइन से

 mongo
use dbName;
db.dropDatabase();
exit

46
मुझे लगता है कि यह समाधान बहुत ही आक्रामक है, मुझे लगता है db.collection.dropIndexes()कि cs_stackX के साथ पर्याप्त है
JorgeGarza

2
@ जोर्जगर्ज़ा मेरे पास एक ही मुद्दा था। मैंने सिर्फ कलेक्शन गिरा दिया और उसके बाद सबकुछ ठीक चलने लगा।
संदीप सुबेदी

मैंने गलती से अपने दो क्षेत्रों के लिए एक अद्वितीय आईडी के साथ संग्रह को इनिशियलाइज़ किया। बाद में जब मैं एक ही आईडी के साथ कई दस्तावेज़ जोड़ना चाहता था तो उसने मुझे तब तक नहीं आने दिया जब तक मैंने संग्रह को हटा दिया और इसे पुन: प्राप्त नहीं कर लिया।
मीर स्नाइडर

1
यदि आप अपने विकास में नए हैं, तो यह प्रयोग करने और यह हल करने का एक अच्छा मौका है ... इस मुद्दे को चलाने के बजाय एक बार जब आपके पास पहले से संग्रहीत उपयोगकर्ता डेटा की बड़ी संख्या में गीगाबाइट्स हैं
Janac Meena

@ जोर्जगर्ज़ा की टिप्पणी से समझ में आता है। सर्वर के फिर से शुरू होने पर स्कीमा फ़ाइल द्वारा एक बार फिर से अनुक्रमित अनुक्रमित पुनर्निर्माण किया जाएगा। इसके अलावा, यह काम किया।
१०

26

संग्रह सूचकांक की जाँच करें।

मेरे पास खेतों के लिए संग्रह में पुराने अनुक्रमित होने के कारण यह मुद्दा था, जिसे अलग-अलग नए रास्ते से संग्रहीत किया जाना चाहिए।

जब आप फ़ील्ड को विशिष्ट के रूप में निर्दिष्ट करते हैं, तो Mongoose इंडेक्स जोड़ता है।


21

खैर मूल रूप से यह त्रुटि कह रही है, कि आपके पास एक विशेष क्षेत्र पर उदाहरण के लिए एक अद्वितीय सूचकांक था: "email_address", इसलिए mongodb संग्रह में प्रत्येक दस्तावेज़ के लिए अद्वितीय ईमेल पता मूल्य की अपेक्षा करता है।

तो चलिए बताते हैं, पहले आपके स्कीमा में यूनिक इंडेक्स को परिभाषित नहीं किया गया था, और फिर आपने 2 उपयोगकर्ताओं को एक ही ईमेल पते या बिना किसी ईमेल पते (शून्य मान) के साथ साइन अप किया था।

बाद में, आपने देखा कि एक गलती हुई थी। इसलिए आप स्कीमा में एक अद्वितीय सूचकांक जोड़कर इसे सही करने का प्रयास करते हैं। लेकिन आपके संग्रह में पहले से ही डुप्लिकेट हैं, इसलिए त्रुटि संदेश कहता है कि आप फिर से डुप्लिकेट मान नहीं डाल सकते हैं।

आपके पास अनिवार्य रूप से तीन विकल्प हैं:

  1. संग्रह ड्रॉप करें

    db.users.drop();

  2. उस दस्तावेज़ को ढूंढें जिसमें वह मान है और उसे हटा दें। मान लें कि मान शून्य था, आप इसका उपयोग करके हटा सकते हैं:

    db.users.remove({ email_address: null });

  3. अद्वितीय सूचकांक छोड़ें:

    db.users.dropIndex(indexName)

मुझे आशा है कि इसने मदद की :)


18

मैं इसका उत्तर / समाधान स्पष्ट करना चाहता हूं जैसे कि मैं 5 साल के व्यक्ति को समझा रहा हूं, इसलिए हर कोई समझ सकता है।

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

हालांकि, एक समस्या है: मैंने महसूस किया है कि हर किसी के पास एक फोननंबर है लेकिन हर किसी का ईमेल पता नहीं है।

जिन लोगों का ईमेल पता नहीं है, उन्होंने मुझसे वादा किया है कि अगले सप्ताह तक उनके पास एक ईमेल पता होगा। लेकिन मैं उन्हें वैसे भी पंजीकृत करना चाहता हूं - इसलिए मैं उनसे कहता हूं कि वे अपने फोननोज़ को पंजीकृत करने के लिए आगे बढ़ें क्योंकि वे ईमेल-इनपुट-फ़ील्ड को खाली छोड़ देते हैं।

वे ऐसा करते हैं।

मेरे डेटाबेस को एक अद्वितीय ईमेल पता फ़ील्ड की आवश्यकता है - लेकिन मेरे पास बहुत से लोग हैं जिनके ईमेल पते के रूप में 'अशक्त' हैं। इसलिए मैं अपने कोड पर जाता हूं और अपने डेटाबेस स्कीमा से कहता हूं कि खाली / अशक्त ईमेल एड्रेस फ़ील्ड की अनुमति दें जिसे मैं बाद में ईमेल अनूठे पते से भर दूंगा जब लोगों ने अगले सप्ताह अपने प्रोफाइल में अपने ईमेल जोड़ने का वादा किया था।

तो यह अब सभी के लिए एक जीत है (लेकिन आप? -]): लोग रजिस्टर करते हैं, मैं उनके डेटा के लिए खुश हूं ... और मेरा डेटाबेस खुश है क्योंकि यह अच्छी तरह से इस्तेमाल किया जा रहा है ... लेकिन आपके बारे में क्या? मैं आपको कोड देने के लिए तैयार हूं जो स्कीमा बना था।

यहाँ कोड है: नोट: ईमेल में विरल संपत्ति है, जो मेरे डेटाबेस को शून्य मानों की अनुमति देने के लिए कहती है जो बाद में अद्वितीय मूल्यों से भरे जाएंगे।

var userSchema = new mongoose.Schema({
  local: {
    name: { type: String },
    email : { type: String, require: true, index:true, unique:true,sparse:true},
    password: { type: String, require:true },
  },
  facebook: {
    id           : { type: String },
    token        : { type: String },
    email        : { type: String },
    name         : { type: String }
  }
});

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

module.exports = User;

मुझे उम्मीद है कि मैंने इसे अच्छी तरह से समझाया है। हैप्पी NodeJS कोडिंग / हैकिंग!


यदि आप एक sparseसूचकांक और uniqueसत्यापन चाहते हैं , और अन्य क्षेत्र हैं जिनकी आवश्यकता नहीं है तो आपको partialFilterExpressionविकल्प का उपयोग करने की आवश्यकता होगी । इस उत्तर को देखें stackoverflow.com/a/34600171/728287
Gianfranco P.


4

इस स्थिति में, मानगो में लॉग इन इंडेक्स को खोजें जो आप अब उपयोग नहीं कर रहे हैं (ओपी के मामले में 'ईमेल')। फिर ड्रॉप इंडेक्स चुनें यहां छवि विवरण दर्ज करें


3

यह मेरा अथक अनुभव है:

'उपयोगकर्ता' स्कीमा में, मैंने 'नाम' को विशिष्ट कुंजी के रूप में सेट किया और फिर कुछ निष्पादन चलाया, जो मुझे लगता है कि डेटाबेस संरचना को स्थापित किया था।

तब मैंने 'उपयोगकर्ता नाम' के रूप में अद्वितीय कुंजी को बदल दिया, और जब मैंने डेटा को डेटाबेस में सहेजा तो अब 'नाम' मान पारित नहीं हुआ। तो मोंगोडब स्वतः ही नए रिकॉर्ड के 'नाम' मूल्य को शून्य के रूप में सेट कर सकता है जो डुप्लिकेट कुंजी है। मैंने सेट की कोशिश की 'नाम' कुंजी के रूप में नहीं अद्वितीय कुंजी {name: {unique: false, type: String}} मूल सेटिंग को ओवरराइड करने के लिए 'उपयोगकर्ता' स्कीमा में । हालांकि, यह काम नहीं किया।

अंत में, मैंने अपना समाधान बनाया:

बस एक यादृच्छिक कुंजी मान सेट करें जो आपके डेटा रिकॉर्ड को सहेजते समय 'नाम' कुंजी की नकल करने की संभावना नहीं होगी। बस गणित विधि '' + Math.random() + Math.random() एक यादृच्छिक स्ट्रिंग बनाती है।


12
मुझे नहीं लगता कि यह एक वैध समाधान है, आपकी समस्या का समाधान है।
रिक

बदसूरत लेकिन व्यावहारिक
एंथनी

3

मेरी भी यही समस्या थी। अलग-अलग तरीकों से डिबग करने की कोशिश की गई। मैंने संग्रह छोड़ने की कोशिश की और यह उसके बाद ठीक काम किया। हालांकि यह एक अच्छा समाधान नहीं है यदि आपके संग्रह में कई दस्तावेज हैं। लेकिन अगर आप विकास की प्रारंभिक अवस्था में हैं तो संग्रह को छोड़ने का प्रयास करें।

db.users.drop();

2

ऐसा इसलिए है क्योंकि कॉन्फ़िगरेशन के साथ समान नाम के साथ पहले से ही एक संग्रह है..बस अपने संग्रह से संग्रह को मोंगो शेल के माध्यम से हटा दें और फिर से प्रयास करें।

db.collectionName.remove ()

अब अपना एप्लिकेशन चलाएं यह काम करना चाहिए


2

मुझे भी इसी तरह की समस्या थी और मैंने महसूस किया कि डिफ़ॉल्ट मोंगो प्रति संग्रह केवल एक स्कीमा का समर्थन करता है। या तो अपने नए स्कीमा को एक अलग संग्रह में संग्रहीत करें या मौजूदा दस्तावेजों को अपने वर्तमान संग्रह के भीतर असंगत स्कीमा के साथ हटा दें। या प्रति संग्रह एक से अधिक स्कीमा रखने का तरीका खोजें।


2

मैंने भी इस मुद्दे का सामना किया है और मैंने इसे हल किया है। यह त्रुटि दर्शाती है कि ईमेल यहाँ पहले से मौजूद है। इसलिए आपको केवल ईमेल विशेषता के लिए अपने मॉडल से इस लाइन को हटाने की आवश्यकता है।

unique: true

यह संभव हो सकता है कि भले ही यह काम नहीं करेगा। तो बस अपने MongoDB से संग्रह को हटाने और अपने सर्वर को पुनरारंभ करने की आवश्यकता है।


1

मुझे यह वही मुद्दा मिला जब मेरे पास मेरे कॉन्फिगर / मॉडल.जेएस में निम्न कॉन्फ़िगरेशन था

module.exports.models = {
  connection: 'mongodb',
  migrate: 'alter'
}

'परिवर्तन' से प्रवास को 'सुरक्षित' में बदलना मेरे लिए इसे निश्चित करता है।

module.exports.models = {
  connection: 'mongodb',
  migrate: 'safe'
}

1

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

नोट: त्रुटि संदेश आपको उस स्थिति में ले जाएगा। इसका एक रास्ता है, जो अब मौजूद नहीं है। im मेरा मामला पुराना रास्ता था ... $ uuid_1 (यह एक इंडेक्स है!), लेकिन नया एक है .... * Private.uuid_1


1

मैं एक ही मुद्दा था जब मैं आम का उपयोग कर परिभाषित स्कीमा को संशोधित करने की कोशिश की। मुझे लगता है कि यह मुद्दा इस कारण से है कि एक ऐसे संग्रह को बनाते समय कुछ अंतर्निहित प्रक्रिया होती है जैसे सूचकांकों का वर्णन करना जो उपयोगकर्ता से छिपे हुए हैं (कम से कम मेरे मामले में)। सबसे अच्छा समाधान जो मैंने पाया है वह था संपूर्ण संग्रह को गिराना। और फिर से शुरू करें।


0

मेरे पास एक ही मुद्दा था। समस्या यह थी कि मैंने एक क्षेत्र को मॉडल से हटा दिया है। जब मैंने db को ठीक किया तो यह ठीक हो गया



-3

संग्रह नाम बदलें यदि यह डेटाबेस में पहले से मौजूद है, तो यह एक त्रुटि दिखाएगा। और यदि आपने कोई भी संपत्ति दी है तो अद्वितीय वही त्रुटि होगी।


-4

एक ही मुद्दा था मैंने uniqueसंपत्ति पर विशेषता को हटाकर इसे हल किया ।

अपने स्कीमा के लिए अनन्य संपत्ति मानों को मान्य या जाँचने का एक और तरीका खोजें।


आपको अपने समाधान के साथ एक उदाहरण प्रदान करना चाहिए।
जोश एडम्स

पहले संग्रह को साफ करने और / या पूरे डेटाबेस को हटाने के लिए काम किया, हालांकि यह एक अस्थायी समाधान था। इसी तरह के मूल्यों के साथ एक और रिकॉर्ड बनाते हुए, भले ही उनके पास अलग-अलग आईडी की फिर भी E11000 डुप्लिकेट कुंजी त्रुटि थी। मैं उस संपत्ति के लिए डुप्लिकेट मानों को अनुमति देना चाहता था इसलिए मैंने केवल अद्वितीय विशेषता को हटा दिया।
15

-7

कृपया संग्रह साफ़ करें या MongoDB डेटाबेस से पूरे संग्रह को हटा दें और बाद में पुनः प्रयास करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.