当前位置: 首页 > 知识库问答 >
问题:

使用jsonb_set()更新只影响嵌套数组中的一个对象

公冶伟
2023-03-14

尝试更新jsonb列中嵌套数组的所有元素,但只更新了一个元素。我的查询:

update table_ 
 set value_ = jsonb_set(value_,cte.json_path,cte.namevalue,false) FROM (
select 
 vals2->'ao'->'sc'->'name' as namevalue,
  ('{iProps,'||index1-1||',value,rules,'||index2-1||',ao,sc}')::text[] as json_path
from 
  table_, 
  jsonb_array_elements(value_->'iProps') 
  with ordinality arr1(vals1,index1),
  jsonb_array_elements(vals1->'value'->'rules') 
  with ordinality arr2(vals2,index2)
  ) AS cte;

请参阅带有示例值的演示:

分贝

我无法理解为什么此查询会更新规则数组中的第一个对象:

iProps -> value -> rules -> ao -> sc -> name = "name1"

但不是后续的:

iProps -> value -> rules -> ao -> sc -> name = "name2"
iProps -> value -> rules -> ao -> sc -> name = "name3" 

共有1个答案

濮阳鸿卓
2023-03-14

UPDATEFROM子句中的subselect返回三行。但是目标表中的每一行只能在一个UPDATE命令中更新一次。结果是,您只能看到这三行中的一行的效果。

或者,用手册的话来说:

当使用来自的时,您应该确保联接为要修改的每一行最多生成一个输出行。换句话说,目标行不应连接到其他表中的多个行。如果是这样,那么只有一个连接行将用于更新目标行,但使用哪一个并不容易预测。

旁白:不要将子查询称为“cte”。这不是一个常见的表表达式。

UPDATE table_ t
SET    value_ = jsonb_set(value_, '{iProps}', sub2.new_prop, false)
FROM  (
   SELECT id
        , jsonb_agg(jsonb_set(prop, '{value, rules}', new_rules, false)
                    ORDER BY idx1) AS new_prop
   FROM  (
      SELECT t.id, arr1.prop, arr1.idx1
           , jsonb_agg(jsonb_set(rule, '{ao,sc}', rule #> '{ao,sc,name}', false)
                       ORDER BY idx2) AS new_rules
      FROM table_ t
         , jsonb_array_elements(value_->'iProps')       WITH ORDINALITY arr1(prop,idx1)
         , jsonb_array_elements(prop->'value'->'rules') WITH ORDINALITY arr2(rule,idx2)
      GROUP  BY t.id, arr1.prop, arr1.idx1
      ) sub1
   GROUP  BY id
   ) sub2
WHERE t.id = sub2.id;

分贝

对每个对象(数组元素)使用jsonb_set(),然后再将它们聚合回数组。首先是叶子层面,然后是更深层次。

我将id作为主键添加到表中。我们需要一些独特的列来保持行之间的分隔。

根据添加的订单可能需要,也可能不需要。添加它以保证原始订单。

当然,如果您的数据与示例一样规则,那么带有专用列的关系设计可能是一个更简单的选择。看见

  • 如何在Postgres 9.4中对JSONB类型的列执行更新操作

 类似资料:
  • 我需要更新嵌套在我的用户文档中的一个字段,该字段包含一个part对象数组,以添加新的part。一个part对象如下所示: 所以这意味着$addToset对我的情况没有好处...现在我不知道该怎么办。

  • 问题内容: 我正在尝试更新嵌套数组中的值,但无法使其正常工作。 我的对象是这样的 我需要将值推送到“ answeredBy”数组。 在下面的示例中,我尝试将“成功”字符串推到“ 123 _id”对象的“ answeredBy”数组中,但是它不起作用。 我找到了此链接,但其答案仅表示我应该使用类似结构的对象而不是数组。这不适用于我的情况。我真的需要将我的对象嵌套在数组中 如果您能在这里帮助我,那就太

  • 假设我们有以下集合,我对此没有什么问题: > 我想增加“item_name”的价格:“my_item_two”,如果它不存在,应该将它追加到“items”数组中。

  • 问题内容: 我有以下mongodb文件结构: 我已经能够使用$ elemMatch来更新操作中的字段,但是当我尝试对参数执行相同的操作(修改)时,它似乎不起作用。我想知道我应该尝试哪种其他方法,以便能够成功更新特定参数中的字段(通过其pid查找)。 我当前拥有但不起作用的更新代码如下所示: 问题答案: MongoDB 3.6及更高版本 MongoDB3.6及更高版本提供了一项新功能,该功能允许您使

  • 这是我的架构:

  • 问题内容: 我正在尝试更新嵌套数组中的值,但无法使其正常工作。 我的对象是这样的 我需要将值推送到“ answeredBy”数组。 在下面的示例中,我尝试将“成功”字符串推到“ 123 _id”对象的“ answeredBy”数组中,但是它不起作用。 我找到了此链接,但其答案仅表明我应该使用像结构这样的对象而不是数组。这不适用于我的情况。我真的需要将我的对象嵌套在数组中 如果您能在这里帮助我,那就