Postgresql从JSONB字段中的嵌套对象数组获取密钥

Postgresql从JSONB字段中的嵌套对象数组获取密钥,postgresql,jsonb,postgresql-json,Postgresql,Jsonb,Postgresql Json,这里是jsonb列的虚拟数据 { "address": [ { "country": "US", "extension": [ { "extension": [ { "valueDecimal": -71.024638, "url": "latitude" }, { "url": "longitude", "valueDecimal": 42

这里是jsonb列的虚拟数据

{
"address": [
{
  "country": "US",
  "extension": [
    {
      "extension": [
        {
          "valueDecimal": -71.024638,
          "url": "latitude"
        },
        {
          "url": "longitude",
          "valueDecimal": 42.082543
        }
      ],
      "url": "url1"
    }
  ],
  "postalCode": "02301",
  "city": "Brockton"
},
{
  "country": "US",
  "extension": [
    {
      "extension": [
        {
          "valueDecimal": -71.024638,
          "url": "latitude"
        },
        {
          "url": "longitude",
          "valueDecimal": 42.082543
        }
      ],
      "url": "url2"
    }
  ],
  "postalCode": "02301",
  "city": "Brockton"
}
]
}
我想得到类似于,
address->'extension'->'extension'->'valueDecimal'
但它只适用于json,但它是一个json数据数组…我期望的输出-

[-71.024638, -71.024638]
我能够通过下面的查询获得第一个扩展(即JSON的第一个数组)

SELECT elems.value  FROM "patient", jsonb_array_elements(resource -> 'extension') AS elems;

所以问题是我无法获取内部的“扩展”(它位于扩展对象内部)数据。任何帮助都会有帮助。

您可以交叉连接多个级别的
jsonb\u数组\u元素

SELECT json_agg(elems3->>'valueDecimal') as latitudes
    FROM patient
 cross join jsonb_array_elements(resource ->'address'  ) AS elems
 cross join jsonb_array_elements(elems ->'extension')  AS elems2
 cross join jsonb_array_elements(elems2 ->'extension') AS elems3
 where elems3->>'url' = 'latitude'


对于大型记录,这可能会较慢,尽管有一些方法可以提高性能。建议您重新设计并规范化您的表,将值作为列单独存储在相应的表中,并且仅在没有其他方法处理数据的情况下使用
JSON

您可以交叉连接多个级别的
jsonb_数组_元素

SELECT json_agg(elems3->>'valueDecimal') as latitudes
    FROM patient
 cross join jsonb_array_elements(resource ->'address'  ) AS elems
 cross join jsonb_array_elements(elems ->'extension')  AS elems2
 cross join jsonb_array_elements(elems2 ->'extension') AS elems3
 where elems3->>'url' = 'latitude'


对于大型记录,这可能会较慢,尽管有一些方法可以提高性能。一个建议的选项是重新设计并规范化您的表,将值分别作为列存储在相应的表中,并仅在没有其他方法处理数据的情况下使用
JSON

是否有任何方法为这些嵌套数据编制索引?@Jitendra:是的,正如我所说,有一些选项,例如使用
GIN
索引。你可以探索它们。是的,我试过了,它适用于嵌套的json对象,但不适用于json对象的多级数组。类似这样的内容-
使用gin在患者身上创建索引idxginp((参考资料->'maritalStatus'>'coding')jsonb_path_ops)
有没有办法索引这个嵌套数据?@Jitendra:是的,正如我所说,有一些选项,例如使用
GIN
索引。你可以探索它们。是的,我试过了,它适用于嵌套的json对象,但不适用于json对象的多级数组。类似这样的内容-
使用gin在患者身上创建索引idxginp((参考资料->'maritalStatus'>'coding')jsonb_path_ops)