2014-06-11 5 views
7

मैं इस तरह एक MongoDB संग्रह में एक दस्तावेज़ है:एक सरणी एक सरणी में है कि में एक आइटम अद्यतन

{ 
    sessions : [ 
     { 
      issues : [ 
       { 
        id : "6e184c73-2926-46e9-a6fd-357b55986a28", 
        text : "some text" 
       }, 
       { 
        id : "588f4547-3169-4c39-ab94-8c77a02a1774", 
        text : "other text" 
       } 
      ] 
     } 
    ] 
} 

और मैं आईडी के साथ इस मुद्दे को अपडेट करना चाहते 588f4547-3169-4c39-ab94 पहले सत्र में -8c77a02a1774

समस्या

मैं केवल पता है कि यह है कि यह पहले सत्र और इस मुद्दे आईडी है

तो मैं कुछ इस तरह की कोशिश (नहीं इस मुद्दे के सूचकांक!):

db.mycollection.update({ "sessions.0.issues.id" : "588f4547-3169-4c39-ab94-8c77a02a1774"}, 
         { $set: { "sessions.0.issues.$.text" : "a new text" }}) 

लेकिन मुझे मिल गया निम्नलिखित परिणाम:

WriteResult({ 
    "nMatched" : 0, 
    "nUpserted" : 0, 
    "nModified" : 0, 
    "writeError" : { 
     "code" : 16837, 
     "errmsg" : "The positional operator did not find the match needed from the query. Unexpanded update: sessions.0.issues.$.text" 
    } 

मैं यह कैसे कर सकता हूं?

सहायता के लिए धन्यवाद।

db.mycollection.update({"sessions.0.issues": {$elemMatch: {id: <yourValue>}}}, {$set: {"sessions.0.issues.$.text": "newText"}}) 

सूचना है कि अपने अद्यतन अभिव्यक्ति सही था:

+0

मुझे नहीं लगता कि "session.0.issues.Id" काम करेगा क्योंकि समस्याएं फिर से एक सरणी है – Sikorski

+0

जब मैं कोई खोज करता हूं तो यह काम करता है, यह दस्तावेज़ देता है। –

उत्तर

9

आप इस (जाहिरा तौर पर बराबर) क्वेरी का उपयोग करने के लिए है।

$elemMatch के बारे में अधिक जानकारी।

बीटीडब्ल्यू, MongoDB reference बताता है कि $ ऑपरेटर "नेस्टेड सरणी को पार करने वाले प्रश्नों के साथ" काम नहीं करता है।

महत्वपूर्ण: $elemMatch केवल संस्करण 4 या उससे अधिक के साथ काम करता है।

+0

यह काम करता है! मैंने '$ elemMatch' के साथ कई संयोजनों की कोशिश की लेकिन कोई भी काम नहीं किया। धन्यवाद –

+0

धन्यवाद @dgiugg, मैंने नई बात सीखी – Smart003

+0

हाय @dgiugg क्या दिया गया है यदि दिया गया आईडी वाला दस्तावेज़ मौजूद नहीं है? मैं 'upsert = True' के साथ अद्यतन() विधि पॉपुलटिंग कर रहा हूं लेकिन यह नया दस्तावेज़ बनाने में मदद नहीं करता है ... – Desprit

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