यहां बड़ा सवाल है, क्या आपको मोंगो के "ऐडटॉसेट" और "पुश" संचालन का लाभ उठाने की ज़रूरत है? यदि आप वास्तव में सरणी में केवल अलग-अलग आइटम को संशोधित करने की योजना बना रहे हैं, तो आपको संभवतः इन सरणियों को ऑब्जेक्ट के रूप में बनाना चाहिए।
यहां बताया गया है कि मैं इसकी संरचना कैसे करूंगा:
{
id: 1,
items:
{
"2" : { "blocks" : { "3" : { txt : 'hello' } } },
"5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
}
}
यह मूल रूप से सब कुछ को सरणियों के बजाय JSON ऑब्जेक्ट्स में बदल देता है। आप $push
. का उपयोग करने की क्षमता खो देते हैं और $addToSet
लेकिन मुझे लगता है कि इससे सब कुछ आसान हो जाता है। उदाहरण के लिए, आपकी क्वेरी कुछ इस तरह दिखेगी:
db.objects.update({'items.2': {$exists:true} }, {'$set': {'items.2.blocks.0.txt': 'hi'}})
आप यह भी देखेंगे कि मैंने "आईडी" को छोड़ दिया है। जब आप इस तरह की चीजों को नेस्ट कर रहे हों तो आप आम तौर पर "आईडी" को केवल उस नंबर को इंडेक्स के रूप में उपयोग करके बदल सकते हैं। "आईडी" अवधारणा अब निहित है।
इस सुविधा को 3.6 में अभिव्यंजक अद्यतनों के साथ जोड़ा गया है।
db.objects.update( {id: 1 }, { $set: { 'items.$[itm].blocks.$[blk].txt': "hi", } }, { multi: false, arrayFilters: [ { 'itm.id': 2 }, { 'blk.id': 3} ] } )