बधाई हो, ऐसा लगता है कि आपको एक बग मिल गया है। यह केवल मेरे परीक्षण में MongoDB 3.0.0 के साथ होता है, या कम से कम MongoDB 2.6.6 पर मौजूद नहीं है। बग अब SERVER-17599 . पर रिकॉर्ड किया गया
नोट :वास्तव में एक "मुद्दा" नहीं है लेकिन "डिज़ाइन द्वारा" पुष्टि की गई है। संस्करण 3.0.0 के लिए विकल्प छोड़ दिया। हालांकि अभी भी दस्तावेज़ीकरण में सूचीबद्ध है।
समस्या यह है कि जब आप "कंपाउंड कुंजी" फ़ील्ड पर मौजूदा डुप्लिकेट के साथ संग्रह पर इसे बनाने का प्रयास करते हैं तो अनुक्रमणिका नहीं बनाई जा रही है और त्रुटियां हैं। उपरोक्त पर, अनुक्रमणिका निर्माण को इसे शेल में प्राप्त करना चाहिए:
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"errmsg" : "exception: E11000 duplicate key error dup key: { : 15.0, : 1.0 }",
"code" : 11000,
"ok" : 0
}
जब कोई डुप्लीकेट मौजूद नहीं है तो आप इंडेक्स बना सकते हैं जैसा कि आप वर्तमान में कोशिश कर रहे हैं और इसे बनाया जाएगा।
तो इस के आसपास काम करने के लिए, पहले इस तरह की प्रक्रिया के साथ डुप्लिकेट को हटा दें:
db.events.aggregate([
{ "$group": {
"_id": { "uid": "$uid", "sid": "$sid" },
"dups": { "$push": "$_id" },
"count": { "$sum": 1 }
}},
{ "$match": { "count": { "$gt": 1 } }}
]).forEach(function(doc) {
doc.dups.shift();
db.events.remove({ "_id": {"$in": doc.dups }});
});
db.events.createIndex({"uid":1 , "sid": 1},{unique:true})
फिर डुप्लिकेट डेटा वाले आगे के इंसर्ट नहीं डाले जाएंगे और उचित त्रुटि दर्ज की जाएगी।
यहां अंतिम नोट यह है कि "ड्रॉपडुप्स" डुप्लिकेट डेटा को हटाने के लिए एक बहुत ही सुंदर समाधान नहीं है। जैसा कि ऊपर दिखाया गया है, आप वास्तव में अधिक नियंत्रण के साथ कुछ चाहते हैं।
दूसरे भाग के लिए, .insert()
. का उपयोग करने के बजाय .update()
. का उपयोग करें तरीका। इसमें एक "अप्सर्ट" विकल्प है
$collection->update(
array( "uid" => 1, "sid" => 1 ),
array( '$set' => $someData ),
array( 'upsert' => true )
);
तो "पाए गए" दस्तावेज़ "संशोधित" हैं और जो दस्तावेज़ नहीं मिले हैं वे "सम्मिलित" हैं। यह भी देखें $setOnInsert
केवल कुछ डेटा बनाने के तरीके के लिए जब दस्तावेज़ वास्तव में डाला जाता है और संशोधित होने पर नहीं।
आपके विशिष्ट प्रयास के लिए, .update()
. का सही सिंटैक्स तीन तर्क है। "क्वेरी", "अपडेट" और "विकल्प":
$collection->update(
array( "uid" => 1, "sid" => 1 ),
array(
'$set' => array( "field" => "this" ),
'$inc' => array( "counter" => 1 ),
'$setOnInsert' => array( "newField" => "another" )
),
array( "upsert" => true )
);
किसी भी अपडेट ऑपरेशन को "उसी पथ तक पहुंचने" की अनुमति नहीं है जैसा कि "अपडेट" दस्तावेज़ अनुभाग में किसी अन्य अपडेट ऑपरेशन में उपयोग किया गया था।