एक सरणी को समतल करने से बड़े दस्तावेज़ बन सकते हैं, क्योंकि प्रत्येक आंतरिक सरणी तत्व के लिए उसके बाहरी तत्व के सभी डेटा को दोहराया जाना चाहिए (और यह सभी स्तरों के लिए)।
इसलिए, यदि फ़्लैटन कोई विकल्प नहीं है, तो उल्लेखित जीरा (सर्वर-831 ):
- दस्तावेज़ को एक चर में पढ़ें
- सरणी में हेरफेर करें
- दस्तावेज़ को अपडेट करें, संपूर्ण सरणी को फिर से लिखें
आपके उदाहरणों को देखते हुए, यह इस तरह दिखेगा:
doc = db.xx.findOne( {_id:1} );
doc.properties.forEach( function(p) {
if ( p.property_id == 2 ) {
p.tags.forEach( function(t) {
if ( t.tag_id == 3 ) {
t.tag_value = 100;
}
else if ( t.tag_id == 4 ) {
newChannel = {};
newChannel.channel_id = 5;
newChannel.channel_name = "test5";
t.channels.push(newChannel);
}
})
}
});
db.xx.update({_id:1},{$set:{properties:doc.properties}});
नतीजा यह है:
doc = db.xx.findOne({_id:1})
{
"_id" : 1,
"properties" : [
{
"property_id" : 1,
"tags" : [
{
"tag_id" : 1,
"tag_value" : 1000,
"channels" : [
{
"channel_id" : 1,
"channel_name" : "test1"
},
{
"channel_id" : 2,
"channel_name" : "test2"
}
]
},
{
"tag_id" : 2,
"tag_value" : 2500,
"channels" : [
{
"channel_id" : 2,
"channel_name" : "test2"
},
{
"channel_id" : 3,
"channel_name" : "test3"
}
]
}
]
},
{
"property_id" : 2,
"tags" : [
{
"tag_id" : 3,
"tag_value" : 100,
"channels" : [
{
"channel_id" : 1,
"channel_name" : "test1"
},
{
"channel_id" : 3,
"channel_name" : "test3"
}
]
},
{
"tag_id" : 4,
"tag_value" : 5000,
"channels" : [
{
"channel_id" : 1,
"channel_name" : "test1"
},
{
"channel_id" : 5,
"channel_name" : "test5"
}
]
}
]
}
]
}