PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Postgres के साथ JSON ग्राफ़ से निकटता सूची

यहां आपके स्कीमा के लिए PLV8 का उपयोग करते हुए एक समाधान दिया गया है।

सबसे पहले, PLSQL फ़ंक्शन और पुनरावर्ती 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;

फिर, उपरोक्त फ़ंक्शन के आउटपुट से ट्री बनाएं।

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;

यह आपके प्रश्न में उल्लिखित आवश्यक JSON प्राप्त करेगा। आशा है कि यह मदद करता है।

मैंने एक विस्तृत पोस्ट/ब्रेकडाउन लिखा है कि यह समाधान कैसे काम करता है यहां



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psql:FATAL:डेटाबेस <उपयोगकर्ता> मौजूद नहीं है

  2. मैं PostgreSQL के साथ पासवर्ड कैसे एन्क्रिप्ट करूं?

  3. PostgreSQL में किसी फ़ंक्शन में नामित तर्कों के लिए कोई सम्मेलन है

  4. रेल 3.2.* और पोस्टग्रेज़ का उपयोग करके स्ट्रिंग बनाम टेक्स्ट - क्या मुझे हमेशा टेक्स्ट का उपयोग करना चाहिए?

  5. पीजी (0.18.2) स्थापित करते समय एक त्रुटि हुई, और बंडलर जारी नहीं रख सकता