Postgres:将唯一对象推入jsonb数组

时间:2020-06-13 06:07:18

标签: sql arrays json postgresql sequelize.js

我有一个jsonb数组appliances,如果该对象不存在,我会尝试将其推入其中。我正在尝试使用此查询

update home
   set appliances = appliances || 
       '{"name": "Television", "uuid": "f6847317-d6fc-476f-8439-3a81f169e9ad"}'
 where uuid = 'f5018a28-fd5f-43df-9d09-4e73da448823'
   and not 
      '{"name": "Television", "uuid": "f6847317-d6fc-476f-8439-3a81f169e9ad"}'::jsonb 
          < @ appliances;

但是会引发错误:

错误:运算符不存在:jsonb <@ jsonb []

appliances的数据类型为jsonb[]。如何正确执行此查询?

2 个答案:

答案 0 :(得分:0)

错误消息告诉您:您的列存储的是jsonbjsonb[])数组,而不是jsonb(可以是jsonb数组或对象)。因此,基本上,您需要修复具有jsonb列的架构,或者使用数组运算符而不是jsonb运算符。

这应该可行,因为jsonb支持相等比较:

and not 
    '{"name": "Television", "uuid": "f6847317-d6fc-476f-8439-3a81f169e9ad"}'::jsonb 
    = any(appliances)

答案 1 :(得分:0)

PostgreSQL数组上的<@运算符和||运算符需要两个操作数都是数组,而不仅仅是它们之一。

update home
   set appliances = appliances || 
       ARRAY['{"name": "Television", "uuid": "f6847317-d6fc-476f-8439-3a81f169e9ad"}'::jsonb]
 where uuid = 'f5018a28-fd5f-43df-9d09-4e73da448823'
   and not 
      ARRAY['{"name": "Television", "uuid": "f6847317-d6fc-476f-8439-3a81f169e9ad"}'::jsonb] 
          <@ appliances;