V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jiobanma
V2EX  ›  Java

关于 pgsql 中 jsonb 类型数据的更新问题

  •  
  •   jiobanma ·
    banmajio · 2020-09-29 15:04:56 +08:00 · 949 次点击
    这是一个创建于 1277 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如一张 pgsql 的表里面有个字段 data 的属性为 jsonb,在进行更新操作时如何对传入的 json 字符串进行解析,对应源数据如果有相同的 key 就替换 value,如果没有,就新增一个 key-value 进去。 比如源数据为{"A":"a","B":"b","C":"c"} 执行更新时我传入的参数为:{"A":"00","D":"d"} 希望的到的数据是:{"A":"a","B":"b","C":"c"}
    查了查 jsonb_set 这个函数,感觉这个只能指定某个 key 和 value 来进行更新,而不能只能识别我传入的一个 json 去进行相应的操作。

    还有其他什么好的办法吗

    3 条回复    2020-09-30 09:10:58 +08:00
    crclz
        1
    crclz  
       2020-09-29 22:25:34 +08:00
    最简单、最不容易出 bug 的解决方案是:整存整取。
    唯一的问题是性能问题。所以,一个 jsonb 字段既不能过大从而影响性能,也不能过小从而让一个业务操作设计太多实体。
    pabupa
        2
    pabupa  
       2020-09-30 03:16:59 +08:00
    可以用操作符。

    `select '{"A":1,"B":2}'::jsonb || '{"A":3, "D": 4}';`
    jiobanma
        3
    jiobanma  
    OP
       2020-09-30 09:10:58 +08:00
    @crclz #1 是的 整存整取确实就没这个问题了,但是我们现在数据库设计的比较... 查询出来的数据是视图里处理好的数据 更新时要往基础表更新 有很多字段对应不上,前端那边是不知道字段的对应关系的,所以有些业务整存整取无法实现。
    @pabupa #2 现在用的就是这个 被百度误导了 以为这个操作符只是在之前的数据后边拼接 不会覆盖的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4729 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:46 · PVG 17:46 · LAX 02:46 · JFK 05:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.