PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Lista sąsiedztwa do wykresu JSON z Postgres

Oto rozwiązanie wykorzystujące PLV8 dla twojego schematu.

Najpierw zbuduj zmaterializowaną ścieżkę za pomocą funkcji PLSQL i rekurencyjnych CTE.

CREATE OR REPLACE FUNCTION get_children(tag_id integer)
RETURNS json AS $$
DECLARE
result json;
BEGIN
SELECT array_to_json(array_agg(row_to_json(t))) INTO result
    FROM (
WITH RECURSIVE tree AS (
  SELECT id, name, ARRAY[]::INTEGER[] AS ancestors
  FROM tags WHERE parent_id IS NULL

  UNION ALL

  SELECT tags.id, tags.name, tree.ancestors || tags.parent_id
  FROM tags, tree
  WHERE tags.parent_id = tree.id
) SELECT id, name, ARRAY[]::INTEGER[] AS children FROM tree WHERE $1 = tree.ancestors[array_upper(tree.ancestors,1)]
) t;
RETURN result;
END;
$$ LANGUAGE plpgsql;

Następnie zbuduj drzewo z wyjścia powyższej funkcji.

CREATE OR REPLACE FUNCTION get_tree(data json) RETURNS json AS $$

var root = [];

for(var i in data) {
  build_tree(data[i]['id'], data[i]['name'], data[i]['children']);
}

function build_tree(id, name, children) {
  var exists = getObject(root, id);
  if(exists) {
       exists['children'] = children;
  }
  else {
    root.push({'id': id, 'name': name, 'children': children});
  }
}


function getObject(theObject, id) {
    var result = null;
    if(theObject instanceof Array) {
        for(var i = 0; i < theObject.length; i++) {
            result = getObject(theObject[i], id);
            if (result) {
                break;
            }   
        }
    }
    else
    {
        for(var prop in theObject) {
            if(prop == 'id') {
                if(theObject[prop] === id) {
                    return theObject;
                }
            }
            if(theObject[prop] instanceof Object || theObject[prop] instanceof Array) {
                result = getObject(theObject[prop], id);
                if (result) {
                    break;
                }
            } 
        }
    }
    return result;
}

    return JSON.stringify(root);
$$ LANGUAGE plv8 IMMUTABLE STRICT;

W ten sposób uzyskasz wymagany JSON wymieniony w Twoim pytaniu. Mam nadzieję, że to pomoże.

Szczegółowy post/omówienie działania tego rozwiązania napisałem tutaj .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyświetlić numery wierszy w zapytaniu PostgreSQL?

  2. Scal wyniki tabeli w kolumny (przestawna/przestawna?)

  3. Jak usunąć nieużywane pliki tymczasowe z Postgresa zarządzanego przez Google Cloud SQL?

  4. Jak zaimportować plik sql bazy danych northwind do PostgreSQL?

  5. Co sprawdzić, jeśli wykorzystanie pamięci PostgreSQL jest wysokie?