Обновленный запрос во вложенном JSON с Postgres удаляет данные - PullRequest
0 голосов
/ 06 мая 2020

У меня есть это JSON do c

    {
  "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'

1 Ответ

0 голосов
/ 06 мая 2020

Вы не передаете весь столбец в качестве первого значения, и вам необходимо указать путь к значению, которое вы хотите изменить, в виде массива:

Например:

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, и он вернет измененный документ.

С уважением

Thom

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...