PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Daftar Kedekatan ke grafik JSON dengan Postgres

Inilah solusi menggunakan PLV8 untuk skema Anda.

Pertama, buat jalur yang terwujud menggunakan fungsi PLSQL dan CTE rekursif.

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;

Kemudian, bangun pohon dari output fungsi di atas.

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;

Ini akan menghasilkan JSON yang diperlukan yang disebutkan dalam pertanyaan Anda. Semoga membantu.

Saya telah menulis posting/perincian terperinci tentang cara kerja solusi ini di sini .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyebarkan Django ke Heroku (Kesalahan Psycopg2)

  2. Bagaimana cara mengatur ulang urutan kunci utama postgres ketika tidak sinkron?

  3. Mengapa `libpq` menggunakan polling daripada notifikasi untuk pengambilan data?

  4. mkdir /mnt/data:sistem file read-only Back-off restart kontainer postgres gagal

  5. Butuh metode cepat untuk mengonversi double menjadi string dalam jumlah besar