2012-03-13 13 views
7

मेरे पास व्यक्तिगत दस्तावेज़ों का डेटाबेस है। प्रत्येक में फोटो नामक एक फ़ील्ड होता है, जो फोटो दस्तावेज़ों की एक श्रृंखला है। मैं प्रत्येक फोटो दस्तावेज़ों में एक नया 'समीक्षा' ध्वज जोड़ना चाहता हूं और इसे गलत में प्रारंभ करना चाहता हूं।नेस्टेड सरणी में सभी दस्तावेज़ों में नया फ़ील्ड जोड़ें

db.person.update({ "_id" : { $exists : true } }, {$set : {photos.reviewed : false} }, false, true) 

हालांकि मैं निम्नलिखित त्रुटि मिलती है:

इस क्वेरी मैं उपयोग करने के लिए कोशिश कर रहा हूँ है यदि हां, तो

SyntaxError: missing : after property id (shell):1 

यह संभव है, और क्या मैं गलत कर रहा हूँ मेरी अद्यतन करें?

यहाँ 'व्यक्ति' दस्तावेज़ की एक पूरी उदाहरण है: किसी के लिए भी

{ 
"_class" : "com.foo.Person", 
"_id" : "2894", 
"name" : "Pixel Spacebag", 
"photos" : [ 
    { 
     "_id" : null, 
     "thumbUrl" : "http://site.com/a_s.jpg", 
     "fullUrl" : "http://site.com/a.jpg" 
    }, 
    { 
     "_id" : null, 
     "thumbUrl" : "http://site.com/b_s.jpg", 
     "fullUrl" : "http://site.com/b.jpg" 
    }] 
} 

बोनस कर्म जो मुझे बता सकते हैं एक क्लीनर क्यों क्वेरी { "_id" : { $exists : true } }

उत्तर

9

Is this possible, and if so, what am I doing wrong in my update?

का उपयोग किए बिना "सभी दस्तावेजों" अद्यतन करने के लिए

नहीं। सामान्य में मोंगोडीबी शीर्ष-स्तर की वस्तुओं पर अपडेट करने में केवल अच्छा है।

यहां अपवाद $ positional operator है। दस्तावेज़ों से: Use this to find an array member and then manipulate it

हालांकि, आपके मामले में आप किसी सरणी में सभी सदस्यों को संशोधित करना चाहते हैं। तो यह वही नहीं है जो आपको चाहिए।

Bonus karma for anyone who can tell me a cleaner why to update "all documents"

db.coll.update(query, update, false, true) आज़माएं, इससे "बहु" अपडेट जारी होगा। वह अंतिम true है जो इसे एक बहु बनाता है।

  1. अद्यतन करने के लिए एक for पाश लिखें:

    Is this possible,

    आप यहाँ दो विकल्प हैं। यह मूल रूप से एक नेस्टेड for लूप होगा, एक डेटा के माध्यम से लूप करने के लिए, दूसरा उप-सरणी के माध्यम से लूप करने के लिए। यदि आपके पास बहुत अधिक डेटा है, तो आप यह लिखना चाहेंगे कि यह आपकी पसंद का चालक है (और संभावित रूप से बहु-धागा)।

  2. reviewed को शून्य के रूप में संभालने के लिए अपना कोड लिखें। डेटा लिखें जैसे कि अगर यह reviewed के साथ एक फोटो में आता है तो यह false होना चाहिए। फिर आप उचित रूप से फ़ील्ड सेट कर सकते हैं और उसे डीबी पर वापस कर सकते हैं।

विधि # 2 ऐसा कुछ है जिसका आपको उपयोग करना चाहिए। चूंकि आपका डेटा बढ़ता है और आप फ़ील्ड जोड़ते हैं, इसलिए पुराने डेटा को "बैक-पोर्ट" करना मुश्किल हो जाता है। यह एसबी में स्कीमा परिवर्तन जारी करने की समस्या के समान है जब आपके पास डीबी में 1 बी आइटम हैं।

इसके बजाय बस null के खिलाफ अपना कोड प्रतिरोधी बनाएं और इसे डिफ़ॉल्ट के रूप में देखें।

फिर भी, यह अभी भी समाधान नहीं है जिसे आप चाहते हैं।

+0

अच्छा जवाब। "बोनस" के लिए जो खोज रहा था उसे स्पष्ट करने के लिए "सरल" क्वेरी के साथ सभी दस्तावेज़ों को अपडेट करने का एक तरीका था ("{" _id "से कुछ अधिक सरल: {$ मौजूद है: सत्य}}"। मैं समझता हूं "बहु "परम, लेकिन मुझे अभी भी एक प्रश्न की आवश्यकता है जो सभी दस्तावेजों से मेल खाती है। मैंने सोचा कि शायद" {} "सभी दस्तावेजों से मेल खाएगा, लेकिन मुझे ऐसा नहीं लगता? –

+0

और नहीं, यह" समाधान "नहीं है, लेकिन यह एक है मैंगोडब (2.0.2) के इलाज संस्करण के साथ मैं जो खोज रहा हूं, उसके लिए मैं अच्छी व्याख्या नहीं कर सकता हूं। यदि कोई समाधान उपलब्ध हो जाता है, तो कृपया भविष्य के उपयोगकर्ताओं के लिए एक और उत्तर पोस्ट करें। –

-1

आप इस

(null, {$set : {"photos.reviewed" : false} }, false, true) 

कर सकते हैं पहले पैरामीटर रिक्त है: कोई विनिर्देश = संग्रह में किसी भी आइटम।

"photos.reviewed" उपफील्ड को अपडेट करने के लिए स्ट्रिंग के रूप में घोषित किया जाना चाहिए।

+2

आप यह नहीं कर सकते हैं। 'assert विफल होने के साथ: एक क्वेरी की आवश्यकता है – Warz

-1

आप इस तरह कर सकते हैं:

db.person.update({}, $set:{name.surname:null}, false, true); 
-1

पुराना विषय अब है, लेकिन यह सिर्फ मोंगो 3.0.6 के साथ ठीक काम किया:

db.users.update({ _id: ObjectId("55e8969119cee85d216211fb") }, { $set: {"settings.pieces": "merida"} })

मेरे मामले उपयोगकर्ता इकाई में

तरह लग रहा है
{ _id: 32, name: "foo", ..., settings: { ..., pieces: "merida", ...} } 
+0

आपके पास कोई सरणी नहीं है, जैसा कि प्रश्न में है। – Gramic

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

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