Postgresql 将对象数组转换为对象映射
Postgresql convert array of objects to map of objects
我在数据库中有一个 table,它有一个类型为 jsonb
的文本列,看起来像:
{
"texts": [
{
"locale": "ar",
"textDictionary": {
"key1": "arabic1",
"key2": "arabic2"
}
},
{
"locale": "en",
"textDictionary": {
"key1": "english1",
"key2": "english2"
}
}
]
}
鉴于上述结构,目标是将此列转换为使用区域设置映射到字典而不是区域设置数组,这是为了支持按区域设置索引 tsvector
像这样的体面方式:
CREATE INDEX texts_index ON docs
USING gin ( to_tsvector('english',texts->'en') );
所需结构:
{
"ar": {
"key1": "arabic1",
"key2": "arabic2"
},
"en": {
"key1": "english1",
"key2": "english2"
}
}
任何建议都很棒!非常感谢你! - 无论如何在 PostgreSQL 中这样做,还是应该在应用程序级别完成?
您可以通过取消嵌套和聚合来转换它:
select id, jsonb_object_agg(x.e ->> 'locale', x.e -> 'textDictionary')
from data d
cross join jsonb_array_elements(d.texts -> 'texts') as x(e)
group by id;
这可用于 UPDATE 语句:
update data
set texts = t.new_texts
from (
select id, jsonb_object_agg(x.e ->> 'locale', x.e -> 'textDictionary') as new_texts
from data d
cross join jsonb_array_elements(d.texts -> 'texts') as x(e)
group by id
) t
where t.id = data.id;
你可以试试这个:
update docs
set texts= (
select jsonb_object_agg(j->>'locale',j->'textDictionary')
from
jsonb_array_elements(texts->'texts') j
)
我在数据库中有一个 table,它有一个类型为 jsonb
的文本列,看起来像:
{
"texts": [
{
"locale": "ar",
"textDictionary": {
"key1": "arabic1",
"key2": "arabic2"
}
},
{
"locale": "en",
"textDictionary": {
"key1": "english1",
"key2": "english2"
}
}
]
}
鉴于上述结构,目标是将此列转换为使用区域设置映射到字典而不是区域设置数组,这是为了支持按区域设置索引 tsvector
像这样的体面方式:
CREATE INDEX texts_index ON docs
USING gin ( to_tsvector('english',texts->'en') );
所需结构:
{
"ar": {
"key1": "arabic1",
"key2": "arabic2"
},
"en": {
"key1": "english1",
"key2": "english2"
}
}
任何建议都很棒!非常感谢你! - 无论如何在 PostgreSQL 中这样做,还是应该在应用程序级别完成?
您可以通过取消嵌套和聚合来转换它:
select id, jsonb_object_agg(x.e ->> 'locale', x.e -> 'textDictionary')
from data d
cross join jsonb_array_elements(d.texts -> 'texts') as x(e)
group by id;
这可用于 UPDATE 语句:
update data
set texts = t.new_texts
from (
select id, jsonb_object_agg(x.e ->> 'locale', x.e -> 'textDictionary') as new_texts
from data d
cross join jsonb_array_elements(d.texts -> 'texts') as x(e)
group by id
) t
where t.id = data.id;
你可以试试这个:
update docs
set texts= (
select jsonb_object_agg(j->>'locale',j->'textDictionary')
from
jsonb_array_elements(texts->'texts') j
)