【问题标题】:Updated query in nested JSON with Postgres removes data使用 Postgres 更新嵌套 JSON 中的查询会删除数据
【发布时间】:2020-05-06 16:11:00
【问题描述】:

我有这个 JSON 文档

    {
  "name": "Perry Street Brasserie",
  "cuisine": "French",
  "stars": 0.3,
  "address": {
    "street": "959 Iveno Square",
    "city": "Fokemlid",
    "state": "AL",
    "zipcode": "18882"
  },
  "reviews": [
    {
      "person": {
        "_id": {
          "$oid": "57d7a121fa937f710a7d486e"
        },
        "address": {
          "city": "Burgessborough",
          "street": "83248 Woods Extension",
          "zip": "47201"
        },
        "birthday": {
          "$date": "2011-03-17T11:21:36Z"
        },
        "email": "murillobrian@cox.net",
        "first_name": "Yvonne",
        "job": "Counselling psychologist",
        "last_name": "Pham"
      },
      "comment": "Aliquam est reiciendis alias neque ad.",
      "created_on": {
        "$date": "2018-02-01T01:56:29.627Z"
      }
    }

我需要更改 first_name 值,但我的查询只是删除了与该名称相关的数据。因此,我的查询成功执行,但最终删除数据而不是更新数据。

我尝试了以下两个查询,结果都一样

   UPDATE restaurants
SET info = jsonb_set('{"reviews":["person"]}', '{"first_name"}', '"Vedat"', true)
WHERE info ->'reviews'-> 0 -> 'person' ->> 'first_name' = 'John'


UPDATE restaurants
SET info = info::jsonb - 'first_name' || '{"reviews":[{"person": {"first_name":"Vedat"}}]}'
WHERE info::json->'reviews'-> 0 -> 'person' ->> 'first_name' = 'Jenna'

【问题讨论】:

    标签: sql arrays json postgresql


    【解决方案1】:

    您没有将整列作为第一个值传递,您需要以数组的形式提供要更改的值的路径:

    例如:

    UPDATE restaurants
    SET info = jsonb_set(info, '{reviews,0,person,first_name}', '"Vedat"', true)
    WHERE info->'reviews'->0->'person'->>'first_name' = 'John';
    

    因此,您实际上必须将整个 JSON 文档传递给 jsonb_set,它会返回修改后的文档。

    问候

    汤姆

    【讨论】:

    • 哦,我犯了一个多么肤浅的错误,非常感谢,这可以节省我几个小时
    • 我很乐意这样做,但我还没有这方面的声誉
    • 啊,我显然不知道该网站的那部分是如何工作的。明白了。
    • 你知道如何选择数组中除第一个元素之外的每个元素:0 吗?
    猜你喜欢
    • 1970-01-01
    • 2017-11-12
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2018-05-20
    相关资源
    最近更新 更多