2016-03-23 10 views
6

मैं नए MySQL JSON समर्थन के साथ एक व्यवस्थापक क्षेत्र के लिए नोट्स/टिप्पणियां सिस्टम बनाने की कोशिश कर रहा हूं। टिप्पणियों को संपादन योग्य होने की आवश्यकता है और मैं भविष्य में अन्य चीजों के लिए समर्थन जोड़ना चाहता था, शायद फ़ाइल अनुलग्नक (फ़ाइलपैथ को JSON में केवल फ़ाइल ही नहीं ही स्टोर करेगा!)।MySQL 5.7.8 JSON नया डेटा मर्ज करें

{ 
    "comments": [ 
    { 
     "comment": "This is a comment", 
     "user_id": 5, 
     "datecreated": "2016-03-19" 
    }, 
    { 
     "comment": "This is a comment", 
     "user_id": 1, 
     "datecreated": "2016-03-19" 
     "comments": [ 
     { 
      "comment": "This is a sub-comment", 
      "user_id": 4, 
      "datecreated": "2016-03-19" 
     }, 
     { 
      "comment": "This is a sub-comment", 
      "user_id": 4, 
      "datecreated": "2016-03-19" 
     } 
     ] 
    } 
    ] 
} 

मैंने सोचा था कि एक विशेष कुंजी हर बार निशाना बनाने के लिए जरूरत के बिना array_merge के समान नए डेटा() में विलय करने के लिए एक तरह से नहीं होगा।

यह क्वेरी काम करती है लेकिन यह केवल एक चीज, टिप्पणी की टेक्स्ट सामग्री को लक्षित करती है। अगर मैं टैग, छवि या फ़ाइल अनुलग्नक इत्यादि को जोड़ना/संपादित करना चाहता हूं तो मुझे बहुत लंबी क्वेरी या कई प्रश्नों की आवश्यकता होगी।

UPDATE shared_notes SET json = JSON_REPLACE(json, "$.comments[1].comment", "This is a test comment") WHERE note_id = :note_id 

मैं JSON_OBJECT साथ JSON_REPLACE और JSON_SET कार्यों उपयोग करने की कोशिश, लेकिन यह है कि निर्दिष्ट कर रहे हैं नहीं, user_id जिसका अर्थ है, DateCreated और उप टिप्पणी अधिलेखित हो सभी कुंजियों अधिलेखित कर देता है।

UPDATE shared_notes SET json = JSON_REPLACE(json, "$.comments[1]", JSON_OBJECT("comment", "This is a test comment")) WHERE note_id = :note_id 

एक प्रश्न लगभग काम करता है की यह फ्रेंकस्टीन लेकिन यह वास्तव में पुराने एक के अंत पर अपडेट की गई टिप्पणी concatenates:

UPDATE shared_notes SET json = JSON_SET(json, "$.comments[1]", JSON_MERGE(JSON_EXTRACT(json, "$.comments[1]"), CAST('{"comment":"Test"}' AS JSON))) WHERE note_id = :note_id 

तो वहाँ आसानी से/गतिशील का उपयोग कर JSON अद्यतन करने के लिए एक बेहतर तरीका है MySQL या $.comments[1].comment, $.comments[1][0].user_id आदि को लक्षित करने का एकमात्र तरीका है?

+0

ओह आदमी, मैं सिर्फ अपने दर्द महसूस कर सकते हैं। मैं समझ नहीं पा रहा हूं कि ऐसे फ़ंक्शंस प्रदान किए गए जेसन फ़ंक्शंस का हिस्सा नहीं हैं। यह एक बुनियादी जरूरत है! – EscapeNetscape

उत्तर

0

यह एक बहुत ही देर से जवाब है, लेकिन अभी भी - आप इसे इस तरह से कर सकते हैं:

create table sampl_test(id int, comments json); 
insert into sampl_test values(1, 
'{ 
    "comments": [ 
     { 
      "comment": "This is a comment", 
      "user_id": 5, 
      "datecreated": "2016-03-19" 
     }, 
     { 
      "comment": "This is a comment", 
      "user_id": 1, 
      "datecreated": "2016-03-19", 
      "comments": [ 
       { 
        "comment": "This is a sub-comment", 
        "user_id": 4, 
        "datecreated": "2016-03-19" 
       }, 
       { 
        "comment": "This is a sub-comment", 
        "user_id": 4, 
        "datecreated": "2016-03-19" 
       } 
      ] 
     } 
    ] 
} 
') 
; 

select json_merge('{"comments" : {"comment" : "This is a test comment" }}', comments) 

from sampl_test; 
संबंधित मुद्दे