2016-03-23 5 views
6

Ich versuche ein Notes/Kommentare System für einen Admin Bereich mit der neuen MySQL JSON Unterstützung zu erstellen. Kommentare müssen editierbar sein und ich wollte in Zukunft Unterstützung für andere Dinge hinzufügen, vielleicht Dateianhänge (würde den Dateipfad in JSON speichern, nur nicht die Datei selbst!).MySQL 5.7.8 JSON merge neue Daten

{ 
    "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" 
     } 
     ] 
    } 
    ] 
} 

Ich dachte, es wäre eine Möglichkeit, neue Daten zu fusionieren ähnlich zu sein(), um array_merge ohne jedes Mal einen bestimmten Schlüssel zum Ziel zu benötigen.

Diese Abfrage funktioniert, aber es zielt nur auf eine Sache, den Textinhalt des Kommentars. Wenn ich Tags, Bild- oder Dateianhänge usw. hinzufügen/bearbeiten möchte, brauche ich eine sehr lange Abfrage oder mehrere Abfragen.

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

Ich versuchte JSON_REPLACE und JSON_SET Funktionen mit JSON_OBJECT verwenden, aber es überschreibt alle Schlüssel, die nicht angegeben sind, was bedeutet, user_id, Datecreated und alle Unter Kommentare überschrieben.

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

Diese franken einer fast Werke Abfrage aber es verkettet tatsächlich die aktualisierte Kommentar auf das Ende des alten:

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 

So gibt es eine bessere Art und Weise leicht zu/dynamisch die JSON aktualisieren mit MySQL oder zielt auf $.comments[1].comment, $.comments[1][0].user_id etc. der einzige Weg?

+0

Oh Mann, ich kann deinen Schmerz fühlen. Ich kann nicht verstehen, dass solche Funktionen nicht Teil der bereitgestellten JSON-Funktionen sind. Es ist so ein Grundbedürfnis! – EscapeNetscape

Antwort

0

Dies ist eine sehr späte Antwort, aber immer noch - Sie können es so machen kann:

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;