क्वेरी को पूरा करने के लिए यह पर्याप्त जानकारी होनी चाहिए:
आइए नकली डेटा बनाएं
create table a (id serial primary key , b jsonb);
insert into a (b)
values ('[
{
"name": "test",
"features": [
{
"name": "feature1",
"granted": false
},
{
"name": "feature2",
"granted": true
}
]
},
{
"name": "another-name",
"features": [
{
"name": "feature1",
"granted": false
},
{
"name": "feature2",
"granted": true
}
]
}
]');
अब अनुक्रमणिका और गुण प्राप्त करने के लिए सामान्यता के साथ jsonb_array_elements का उपयोग करके सरणी को विस्फोट करें
select first_level.id, position, feature_position, feature
from (select a.id, arr.*
from a,
jsonb_array_elements(a.b) with ordinality arr (elem, position)
where elem ->> 'name' = 'test') first_level,
jsonb_array_elements(first_level.elem -> 'features') with ordinality features (feature, feature_position);
इस क्वेरी का परिणाम है:
1,1,1,"{""name"": ""feature1"", ""granted"": false}"
1,1,2,"{""name"": ""feature2"", ""granted"": true}"
वहां आपके पास आवश्यक जानकारी है जो आपको आवश्यक उप तत्वों के साथ-साथ आपकी क्वेरी के लिए आवश्यक सभी अनुक्रमणिका लाने के लिए आवश्यक है।
अब, अंतिम संपादन के लिए, आपके पास पहले से ही वह प्रश्न था जो आप चाहते थे:
UPDATE my_table SET modules =
jsonb_insert(my_column, '{0, features, 0}', '{"name": "newFeature", "granted": false}')
WHERE my_column ->> 'name' = 'test' AND my_column @> '{"features": [{"name":"feature1", "granted": false}]}';
जहां आप आईडी का उपयोग करेंगे, क्योंकि वे पंक्तियां हैं जिनमें आप रुचि रखते हैं, और इंडेक्स में आप उन्हें क्वेरी से प्राप्त करते हैं। तो:
UPDATE my_table SET modules =
jsonb_insert(my_column, '{' || exploded_info.position::string || ', features, ' || exploded_info.feature_position || '}', '{"name": "newFeature", "granted": false}') from (/* previous query */) as exploded_info
WHERE exploded_info.id = my_table.id and exploded_info.feature -> 'granted' = false;
जैसा कि आप देख सकते हैं कि यह आसानी से बहुत बुरा हो जाता है।
मैं या तो अधिक sql दृष्टिकोण का उपयोग करने की सलाह दूंगा, अर्थात, एक तालिका में सुविधाओं के बजाय एक json के अंदर, एक fk जो आपकी तालिका से लिंक कर रहा है ... यदि आपको वास्तव में json का उपयोग करने की आवश्यकता है, उदाहरण के लिए, क्योंकि डोमेन वास्तव में जटिल है और आवेदन स्तर पर परिभाषित है और बहुत लचीला है। फिर मैं ऐप कोड के अंदर अपडेट करने की सलाह दूंगा