2014-05-21 7 views
10

बनाते समय जब नए दस्तावेज़ का निर्माण और फिर एक नई उप दस्तावेज़ Upsert को मैं इस त्रुटि मिलती है कोशिश:नकली चाबी त्रुटि एक नया नेवला उप दस्तावेज़

Object {error: "E11000 duplicate key error index: sales.users.$gro…p key: 
     { : ObjectId('537b7788da19c4601d061d04') }"} 
error: "E11000 duplicate key error index: sales.users.$groups.groupId_1 
     dup key: { : ObjectId('537b7788da19c4601d061d04') }" 
__proto__: Object 

उप दस्तावेज़ मैं सम्मिलित करने के लिए कोशिश कर रहा हूँ उप-स्कीमा के रूप में परिभाषित किया गया है जिसमें आवश्यकताएँ {अद्वितीय: सत्य}, {sparse: true} के साथ समूह आईडी फ़ील्ड है। नेवला विधि कॉल मैं Upsert करने के लिए उपयोग कर रहा हूँ है:

User.findByIdAndUpdate(userId, 
         { $push: { 'groups': userUpdate} }, 
         function (err, obj) where userUpdate = { groupId: groupId }. 

नहीं रह गया है अनुक्रमित समस्या का समाधान होने और इस त्रुटि छोड़ने के बाद होता है।

var UserSchema = new Schema({ 
    email: { 
     type: String, 
     required: true, 
     unique: true 
    }, 
    active: { 
     type: Boolean, 
     default: true 
    }, 
    username: { 
     type: String, 
     required: true, 
     unique: true 
    }, 
    password: { 
     salt: { 
      type: String, 
      required: true 
     }, 
     hash: { 
      type: String, 
      required: true 
     } 
    }, 
    securityQuestion: { 
     question: String, 
     salt: String, 
     hash: String 
    }, 
    mobile: { 
     PIN: Number, 
     Number: Number 
    }, 
    createDate: { 
     type: Date, 
     default: Date.now 
    }, 
    updateDate: Date, 
    lastLoginDate: Date, 
    prevLoginDate: Date, 
    passChangeDate: Date, 
    locked: Boolean, 
    lockDate: Date, 
    failedCount: Number, 
    failedDate: Date, 
    profile: profile, 
    preference: preference, 
    courses: [UserCourseSchema], 
    groups: [UserGroupSchema], 
    rewards: [UserRewardSchema], 
    roles: UserRoleSchema, 
    scores: [UserScoreSchema] 
}); 

var UserGroupSchema = new Schema({ 
    groupId: { 
     type: Schema.Types.ObjectId, 
     unique: true, 
     sparse: true 
    }, 
    joinDate: { 
     type: Date, 
     default: Date.now 
    }, 
    receiveNotifications: { 
     type: Boolean, 
     default: true 
    }, 
    isAdmin: { 
     type: Boolean, 
     default: false 
    }, 
    isOwner: { 
     type: Boolean, 
     default: false 
    }, 
    isModerator: { 
     type: Boolean, 
     default: false 
    }, 
    updateDate: Date 
}); 
+0

क्या आप दस्तावेजों की स्कीमा और उपयोग किए गए इंडेक्स के साथ अपना प्रश्न बढ़ा सकते हैं? –

+1

यदि आप यह सुनिश्चित करने की कोशिश कर रहे हैं कि एक उपयोगकर्ता के पास 'समूह' में डुप्लिकेट समूह नहीं हो सकते हैं, तो यह काम नहीं करेगा। Http://stackoverflow.com/q/13907257/1259510 – JohnnyHK

+0

देखें जो चीज़ मैं समझने में असमर्थ हूं वह यह है कि यह ** UserUpdate ** _id क्यों है? सावधानियों के लिए, $ push पर जाने से पहले इस ओबीजे से _id संपत्ति को हटा दें – Taha

उत्तर

0

{अद्वितीय: सच} ग्रुप मैदान पर आवश्यकता का मतलब है कि संग्रह में कोई दो दस्तावेजों बल्कि आप क्या इरादा, दस्तावेज़ के भीतर groupIds की विशिष्टता को लागू करने से एक ही ग्रुप शामिल होती है। आप इसके बजाय MongoDB $addToSet ऑपरेटर का उपयोग करके जो भी चाहते हैं वह कर सकते हैं।

1

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

एक और सबसे अच्छा तरीका है $ addToSet उपयोग करने के लिए है। उम्मीद है कि यह मदद करता है।

0

यदि आप समूह समूह से मौजूदा समूह को अद्यतन करने का प्रयास कर रहे हैं, तो $ push समाधान नहीं है।

User.findAndUpdate({_id:userId,'groups.groupId': userUpdate.groupId}, 
         { $set: {'groups.$': userUpdate}}, 
         function (err, obj){}) 

अन्यथा अन्य के रूप में सुझाव दिया $ addToSet तत्व जोड़ देगा सेट में यदि वह मौजूद है।

User.findByIdAndUpdate(userId, 
         { $addToSet : { 'groups': userUpdate} }, 
         function (err, obj){}) 
संबंधित मुद्दे