2017-02-03 2 views
2

Ich habe eine Tabelle mit dem Namen „json“ in meiner Datenbank, mit 2 Spalten: „id“ und „data“node.js und postgresql UPDATE verschachtelter JSON Schlüssel

nur eine Zeile im Innern in dem Moment gespeichert, mit 1 als ID und eine JSON-Struktur als Daten:

{ 
    "elements": { 
     "nodes": [ 
      { 
       "data": { 
        "id": "n0", 
        "name": "Name here", 
        "color": "#FFFFFF" 
       } 
      }, 
      { 
       "bob": "hello" 
      } 
     ] 
    } 
} 

ich brauche einen Schlüssel des json zu aktualisieren: „Name hier“ hat

„aktualisiert“ werden

das ist, was ich versucht:

db.query("UPDATE json SET $1 WHERE data->'elements'->'nodes'->0->'data'->'name'=$2", ['updated', 'Name here']) 

aber ich erhalte eine Fehlermeldung:

syntax error at or near "'updated'"

+0

Ist der Name der Spalte ein Problem? – tadman

+0

@tadman Ich habe es nur geändert in "mydata", aber immer noch gleichen Fehler ... – neoDev

+0

Ist eine einfachere Version dieser Abfrage erfolgreich? Müsste hier vielleicht eine reduktive Exploration machen. – tadman

Antwort

0

Wenn die Postgres mit JSON navigators ist es wichtig, Ihre Kette mit dem text Retrieval-Navigator beenden ->> wenn Sie Vergleiche machen wollen wie folgt aus:

UPDATE json SET $1 WHERE data->'elements'->'nodes'->0->'data'->>'name'=$2 

That sollte den Vergleich von text zu text anstelle von json zulassen.

Ich glaube, Sie könnten auch in der Lage sein #>> zu verwenden, um den ganzen Weg nach unten in einem Schuss zu graben:

UPDATE json SET $1 WHERE data#>>'{elements,nodes,0,data,name}'=$2 
+0

Ich bekomme den gleichen Fehler: 'Syntax Fehler bei oder in der Nähe von" 'aktualisiert' "für beide Ihrer Beispiele – neoDev

+0

[In diesem Post] (http://Stackoverflow.com/a/26704636/5638869) Ich lese, dass Postgres-Updates die ganze Zeile, auch wenn eine Änderung nur ein kleiner Teil davon ist, da JSON in PostgreSQL Daten speichern soll, die nicht manipuliert werden müssen. Wenn ich an dieser Stelle weitermachen möchte, könnte ich den JSON (wie ich oben gezeigt habe) herausholen, ausarbeiten und dann an die Datenbank senden. Macht das Sinn? – neoDev

+0

Wenn Sie versuchen, einen Teil Ihrer JSON-Struktur neu zuzuweisen, die möglicherweise nicht die Syntax dafür ist. Verwenden Sie Postgres 9.6? – tadman