You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中从JSONB列移除指定JSON对象的方法求助

解决方案:从PostgreSQL JSONB数组中移除指定对象

你的核心问题是json_workouts为JSONB数组类型,而之前的操作均针对JSON对象设计,因此无法生效。以下是两种可行的解决方法:

方法1:展开数组过滤后重新聚合

通过jsonb_array_elements将数组拆分为单个元素,过滤掉目标对象后,再用jsonb_agg重新聚合成数组:

UPDATE my_users
SET json_workouts = COALESCE(
  (SELECT jsonb_agg(elem)
   FROM jsonb_array_elements(json_workouts) elem
   WHERE elem <> '{"name": "vmi2", "path": "efefe\\feff\\fefefe", "type": "Gym"}'::jsonb),
  '[]'::jsonb
)
WHERE username = 'c';
  • COALESCE用于处理过滤后数组为空的场景,确保最终值是空数组而非null
  • 需保证目标对象的JSON格式与数组中元素完全匹配,包括转义字符(如路径中的反斜杠)

方法2:使用JSON路径查询(PostgreSQL 12+)

若你的PostgreSQL版本为12或更高,可使用jsonb_path_query_array直接过滤数组,写法更简洁:

UPDATE my_users
SET json_workouts = jsonb_path_query_array(
  json_workouts,
  '$[*] ? (@ != {"name": "vmi2", "path": "efefe\\feff\\fefefe", "type": "Gym"})'
)
WHERE username = 'c';

原语句无效原因说明

  • 第一个DELETE语句:DELETE FROM my_users是删除整个用户记录,而非修改JSONB数组。同时json_workouts ->> 'name'无法从数组中提取元素的name字段——数组本身没有name键,必须遍历数组元素才能访问其内部属性。
  • 第二个UPDATE语句:json_workouts - 'name'用于删除JSON对象中的指定键,但你的json_workouts是数组类型,该操作对数组不生效。

内容的提问来源于stack exchange,提问作者Robin Gergelyfi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:51:41