2013-04-25 11 views
5

मैं इस तथ्य को समझता हूं कि आप मौजूदा mongodb दस्तावेज़ पर _id अपडेट नहीं कर सकते हैं।Mongodb अद्यतन। _8 पर सेटऑनइन्सर्ट मोड

लेकिन क्या कोई कारण है कि हम इसे 'setOnInsert' भाग में अपरिवर्तित रूप में उपयोग नहीं कर सकते हैं? क्योंकि यह 'डालने पर' है इसलिए यह एक अद्यतन नहीं है।

मेरे उम्मीद उपयोग यह है:

db.myCol.update({_id:12345},{$setOnInsert:{_id:12345},$set:{myValue:'hi'}}); 

यह एक बग है या मैं कुछ याद आ रही है?

+1

अपरेटर ध्वज कहां है? बस सेट छोड़ दें बंद करें और सही चीज होगी। db.myCol.update ({_ id: 12345}, {$ set: {myValue: 'hi'}}) –

+1

हाँ आप सही हैं मैं अपरिपक्व ध्वज को शामिल करना भूल गया। स्पष्ट रूप से यह स्वचालित रूप से डालने के लिए खोज भाग शामिल करता है यदि यह एक अपरिवर्तनीय है। धन्यवाद :) –

+0

बिल्कुल। क्या आप इसे उत्तर के रूप में लिखना चाहते हैं या मुझे चाहिए? –

उत्तर

9

मोंगोडीबी सेट के हिस्से के रूप में एक अपरिपक्व क्वेरी के लिए 'क्वेरी' भाग का उपयोग करता है, जिसका अर्थ है कि आपको अपने स्वयं के _id को निर्दिष्ट करना चाहते हैं कि आप के सेट भाग में _id निर्दिष्ट नहीं करना है।

नोट: ऊपर मेरी क्वेरी में एक छोटी सी बग भी थी जो गायब अपरिपक्व ध्वज था।

यह सही क्वेरी है:

db.myCol.update({_id:12345},{$set:{myValue:'hi'}},{upsert:true}); 

तो रिकॉर्ड मौजूद नहीं है, इस प्रश्न के एक रिकॉर्ड है जो इस तरह दिखता है सम्मिलित होगा:

{_id:12345,myValue:'hi'} 
3

वास्तव में, इस में एक बग है मोंगो विकास संस्करण 2.5.4 में तय या रिलीज 2.6.0:

https://jira.mongodb.org/browse/SERVER-9958

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

+0

यदि यह एक बग है, तो यह अभी भी 3.4 में मौजूद है। मैंने {_id} के साथ $ setOnInsert का उपयोग करने का प्रयास किया है, लेकिन इसने मुझे अनुमति नहीं दी है, जिस पर मुझे अनुमति नहीं है। –

संबंधित मुद्दे