2010-08-13 13 views
8

में उप-उप-सरणी आइटम सेट करने के लिए कैसे करें मैं एक वेबपैप विकसित कर रहा हूं जिसमें पोर्टल-आईएसएच घटक है (कई पैनलों की तरह सोचें जो कॉलम से कॉलम तक ड्रग हो सकते हैं और जोड़े या हटाए जा सकते हैं)। मैं बहुत की तरह एक प्रारूप के साथ इस जानकारी को संगृहीत करने MongoDB उपयोग कर रहा हूँ ...MongoDB

{ 
    _id: ObjectId(...), 
    title: 'My Layout', 
    columns: [ 
     { 
      order: 1, 
      width: 30, 
      panels: [ 
       { title: 'Panel Title', top: 100, content: '...' }, 
       { title: 'Panel Title', top: 250, content: '...' }, 
      ] 
     }, 
     { 
      ... multiple columns ... 
     } 
    ] 
} 

मैं अद्यतन() साथ परमाणु/संशोधक संचालन उपयोग करने का प्रयास कर रहा हूँ और इस भ्रामक हो रही है। अगर मैं सिर्फ एक विशिष्ट पैनल की एक संपत्ति को अपडेट करना चाहता था, तो मैं इसका संदर्भ कैसे दूं?

update(
    { _id: ObjectId(...) }, 
    { $set: { columns.[???].panels.[???].top: 500 } 
) 

उत्तर

14

यदि आप सरणी में अनुक्रमणिका जानते हैं तो आप सीधे डॉट नोटेशन का उपयोग करके सरणी तत्व का उपयोग कर सकते हैं।

update(
{ _id: ObjectId(xxxx) }, 
{ $set: { 'columns.0.panels.0.top' : 125}} 
) 

सुनिश्चित करें कि आप स्ट्रिंग के रूप में कोट्स में डॉट नोटेड पथ को एन्केज़ करते हैं।

संपादित करें:

यह कैसे गतिशील रूप से काम कर सकता था पर और अधिक विस्तार देने के लिए, मैं PHP में एक उदाहरण देता हूँ:

$action = array("columns.$colNum.panels.$panelNum" => $newValue); 

हाँ है positional operator, लेकिन यह does not appear to be advanced enough बदलने के लिए सरणियों के भीतर सरणियों, इस MongoDB 1.7.0

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

स्तंभ वस्तु:: आप एक संग्रह है कि पैनल & स्तंभ वस्तुओं बना सकते हैं

{ 
_id: // MongoId 
type: 'column', 
user: 'username', 
order: 1, 
width: 30, 
} 

पैनल वस्तु:

{ 
_id: //MongoId 
type: 'panel', 
user: 'username', 
parentColumn: //the columns _id string 
top: 125, 
left: 100 
} 

तो फिर तुम सभी स्तंभों कि ऐसा करने से एक उपयोगकर्ता से संबंधित पा सकते हैं:

find({ type: 'column', user:'username'}); 

आप एक विशिष्ट कॉलम के लिए सभी पैनलों को कर सकते हैं:

find({type: 'panel', columnOwner:'ownerID'}); 

के बाद से प्रत्येक स्तंभ और पैनल इसे करने के लिए MongoDB द्वारा दिए गए एक अद्वितीय ID होगा, आप आसानी से क्वेरी और atomically सेट विकल्प हो सकते हैं।

update({'_id': ObjectId('idstring')}, {$set : { 'top' : 125}}); 
+0

मैं यह भी सोच रहा हूँ हटा दें। इंडेक्स को हार्ड कोडिंग वास्तव में संभव नहीं है। अभी भी स्थितित्मक ऑपरेटर का उपयोग करने का तरीका जानने का प्रयास कर रहे हैं http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator – Dex

+0

अधिक जानकारी – Klinky

0

मैं भी इस तरह एक स्थिति थी, मैं $ addToSet पीछा $ पुल के बाद यानी अद्यतन मैं क्या जरूरत की जगह।

update(
{ _id: ObjectId(...) }, 
{ $addToSet: { columns.$.panels : "new sub-Doc" } 
) 

और फिर पुराने मूल्य

update({_id:ObjectId(....)},{$pull : { columns.$.panels : {"top" : 100} }}) 
+0

कॉलम पर $ क्या है? –

+0

"$" एक प्लेसहोल्डर के रूप में कार्य करता है जो अद्यतन में क्वेरी स्थिति से मेल खाने वाले पहले तत्व को अद्यतन करने के लिए करता है। कृपया https: //docs.mongodb देखें।com/मैनुअल/संदर्भ/ऑपरेटर/अद्यतन/स्थितीय/# up._S_ – achuth