N1QL запрос базы данных - Обновление массива в динамическом объекте JSON. (Удаление элемента массива, вложенного в объект Json) - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь написать запрос на обновление N1QL.Я хочу удалить те объекты из массива, чье значение «vs» является чем-то, скажем, «k_a».Это мой образец документа.

{
  "ADD": {
    "k_2": [
      {
        "allowed": false,
        "vs": "k_a"
      },
      {
        "allowed": false,
        "vs": "k_d"
      }
    ],
    "k_9": [
      {
        "allowed": false,
        "vs": "k_f"
      },
      {
        "allowed": true,
        "vs": "k_a"
      }
    ]
  },
  "REMOVE": {
    "k_4": [
      {
        "allowed": true,
        "vs": "k_a"
      }
    ],
    "k_7": [
      {
        "allowed": false,
        "vs": "k_g"
      },
      {
        "allowed": true,
        "vs": "k_a"
      }
    ]
  }
}

Я уже пробовал этот запрос -

UPDATE bucket_name sp
    SET obj = ARRAY v FOR v IN obj WHEN v.vs != "k_a" END
    FOR obj IN OBJECT_VALUES(sp.ADD) END WHERE META(sp).id = "SPT|O|789"

, но, вероятно, я делаю что-то не так.

Это документ, который я ожидаю после обновления-

{
  "ADD": {
    "k_2": [
      {
        "allowed": false,
        "vs": "k_d"
      }
    ],
    "k_9": [
      {
        "allowed": false,
        "vs": "k_f"
      }
    ]
  },
  "REMOVE": {
    "k_4": [],
    "k_7": [
      {
        "allowed": false,
        "vs": "k_g"
      }
    ]
  }
}

Примечание. Здесь ключевые слова «ДОБАВИТЬ» и «УДАЛИТЬ» являются статическими, но все в форме «k_number» или «k_letter» является динамическим и может быть любым.

Любая помощь будет высоко оценена.

1 Ответ

1 голос
/ 14 мая 2019

Где условие определяет, должен ли документ изменяться или нет. Предложение SET определяет, что нужно изменить. Вы должны использовать предложение where, чтобы избежать ненужной мутации (Пример: если повторить то же самое обновление во второй раз, обновления не должно быть, т.е. число мутаций должно быть 0, если кто-то не изменил документ.).

UPDATE sourceprioritization sp USE KEYS "SPT|O|789"
    SET sp.[obj1.name].[obj.name] = ARRAY v FOR v IN obj.val WHEN v.vs != "k_a" END
    FOR obj IN OBJECT_PAIRS(obj1.val)
           FOR obj1 IN OBJECT_PAIRS(sp) WHEN obj1.name IN ["ADD", "REMOVE"] AND "k_a" IN obj.val[*].vs END
WHERE ANY obj1 IN OBJECT_PAIRS(sp) SATISFIES obj1.name IN ["ADD", "REMOVE"]
      AND (ANY obj IN OBJECT_PAIRS(obj1.val) SATISFIES "k_a" IN obj.val[*].vs END) END;

OR

UPDATE sourceprioritization sp USE KEYS "SPT|O|789"
    SET obj1.val.[obj.name] = ARRAY v FOR v IN obj.val WHEN v.vs != "k_a" END
    FOR obj IN OBJECT_PAIRS(obj1.val)
           FOR obj1 IN OBJECT_PAIRS(sp) WHEN obj1.name IN ["ADD", "REMOVE"] AND "k_a" IN obj.val[*].vs END
WHERE ANY obj1 IN OBJECT_PAIRS(sp) SATISFIES obj1.name IN ["ADD", "REMOVE"]
      AND (ANY obj IN OBJECT_PAIRS(obj1.val) SATISFIES "k_a" IN obj.val[*].vs END) END;
...