如何解决jsonb中的递归嵌套树?

问题描述

所以我有一棵这样的扁平树:

[{
    aid: "id3"
    atype: ""
    data: ["id1","id2"]
},{
    aid: "id1"
    atype: ""
    data: ["id3",{
    aid: "id2"
    atype: ""
    bdata: {aid: "id4",atype: "nested",data: ["id1","id3"]}
    data: []
}]

我想收集那棵树并用递归循环将 id 解析为数据,就像这样(假设我们从 "id3" 开始):

{
    aid: "id3"
    payload: "1"
    data: [ 
    "id1":{
        aid: "id1"
        atype: ""
        data: ["id3":Null,"id2":Null]
    },"id2":{
            aid: "id2"
            atype: ""
            bdata: {aid: "id4",data: ["id1":Null,"id3":Null]}
            data: []
    }]
}

这样我们就可以进行广度优先搜索,并在第一次进入时将某些字段解析为 "value": "object with that field""value": Null

那么如何在 Postgres JSONb\ JSON 中将这样的列表实现到一棵树上?

我知道有人可以使用 PL/Python 之类的东西来做到这一点,但我没能看到一个 PL/Python 函数示例,它可以执行诸如不将所有 JSON 记录放入 ram 之类的事情...

{'id1': {'aid': 'id1','atype': '','data': ['id3','id2']},'id2': {'aid': 'id2','bdata': {'aid': 'id4','atype': 'nested','data': ['id1','id3']},'data': []},'id3': {'aid': 'id3','id2']}}

对我来说不是真的有用 - 所以我需要一棵真正的树。

解决方法

你的方法有问题。

让我们考虑以下 json。

  {
    "aid": "id3","atype": "","data": ["id1","id2"]
  },{
    "aid": "id4","id2"]
  }

这里,id4的id1和id2数据需要再次复制,造成大量重复数据。

取而代之的是,将您的数据转换为字典。 您可以通过调用 id 来访问数据,例如“id1”、“id2”等。

data_map = {}
for data in data_array:
   data_map.__setitem__(data['aid'],data)

以下将是示例输出。

{
  "id3": {
  "aid": "id3","data": [
    "id1","id2"
  ]
}

这样您就可以直接访问 id 并且结构中没有重复项。

完整的示例代码

import json

json_data = '''
[
  {
    "aid": "id3",{
    "aid": "id1","data": ["id3",{
    "aid": "id2","bdata": {"aid": "id4","atype": "nested","id3"]},"data": []
  }
]
'''
data_array = json.loads(json_data)

data_map = {}
for data in data_array:
    data_map.__setitem__(data['aid'],data)

print(data_map)