2012-12-21 8 views
36

मैं निम्नलिखित दस्तावेज़ MongoDB में संग्रहीत किए गए:MongoDB आंतरिक सूची में कोई तत्व कैसे डालें?

{ 
    name: 'myDoc', 
    list: [ 
     { 
      id:1 
      items:[ 
       {id:1, name:'item1'}, 
       {id:2, name:'item2'} 
      ] 
     }, 
     { 
      id:2 
      items:[ 
       {id:1, name:'item1'}, 
       {id:3, name:'item3'} 
      ] 
     } 
    ] 
} 

मैं 'सूची' के लिए एक तत्व जोड़ने के लिए एक तरह से $addToSet का उपयोग कर पाया, लेकिन मैं 'आइटम' की एक विशिष्ट सूची में जोड़ने के लिए एक रास्ता नहीं मिल सका एक वस्तु।

उदा। मैं निम्नलिखित मिल:

{id:5, name:'item5'} 

और मैं आईडी के साथ सूची में तत्व के मद में जोड़ने के लिए चाहते हैं: 2। कर यह $push साथ होगा की

उत्तर

32

एक ही रास्ता:

db.col.update(
    { name: 'doc', 'list.id': 2 }, 
    {$push: {'list.$.items': {id: 5, name: 'item5'}}} 
) 

http://docs.mongodb.org/manual/reference/operator/push/

तुम भी जैसे अन्य ऑपरेटरों के साथ $push जगह ले सकता है (संभवतः) $addToSet सटीक परिणाम आप देख रहे हैं पाने के लिए।

11

आप इस का उपयोग कर सकते हैं: -

> var toInsert = {id: 5, name: 'item6'} 
> db.abc.update(
      { name: 'myDoc', list: { $elemMatch: { id: 2 } } }, 
      { $addToSet: { 'list.$.items': toInsert } } 
) 

query हिस्सा id = 2 साथ list सरणी से दस्तावेज़ मिल जाएगा। फिर हम उस सरणी अनुक्रमणिका में एक नया तत्व जोड़ने के लिए $ स्थितित्मक तत्व का उपयोग करते हैं।

positional $ operator


देखें आप, साथ ही 'list.id': 2 साथ list: {$elemMatch: {id: 2}} बदल सकते हैं।

लेकिन $elemMatch का उपयोग करना बेहतर होगा, जब आप अपने सरणी के कई तत्वों के आधार पर अपडेट करना चाहते हैं। उदाहरण के लिए, id है जब अपने मिलान मापदंड और कुछ सरणी में एक और क्षेत्र का कहना है length: -

list: {$elemMatch: {id: 2, length: 5}} 
+0

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

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