создать индекс кушетки для ARRAY_REMOVE

Я хочу выполнить этот запрос:

UPDATE `bucket` SET etats= ARRAY_REMOVE( etats, etats[2])

мой вопрос в том, как создать индекс для выполнения этого запроса, я не хочу использовать

диван-кровать первичного индекса.

цель запроса - удалить элемент из массива etats.

пример документа:

{
  "lastUpdateTime": "2019-03-31T22:02:00.164",
  "origin": "origin1",
  "etats": [
    {
      "dateTime": "2019-03-28T17:13:49.766",
      "etat": "etat1",
      "code": "code1"
    },
    {
      "dateTime": "2019-03-29T15:26:48.577",
      "etat": "etat2",
      "code": "code2"
    },
    {
      "dateTime": "2019-03-31T22:01:59.843",
      "etat": "etat3",
      "code": "code3"
    }
  ],
  "etatType": "type1"
}

person Issamovitch    schedule 04.04.2019    source источник
comment
Не могли бы вы привести пример или два из документов?   -  person Matthew Groves    schedule 04.04.2019
comment
Кроме того, похоже, что этот запрос предназначен для воздействия на каждый документ в корзине, поэтому я не уверен, что индекс может сильно помочь.   -  person Matthew Groves    schedule 04.04.2019
comment
@MatthewGroves, пожалуйста, найдите пример документа, я редактирую сообщение   -  person Issamovitch    schedule 04.04.2019


Ответы (1)


У вас должно быть предложение WHERE для выбора индекса, в противном случае единственным вариантом является первичный индекс. Обычно вы проверяете элементы, если они есть, а затем обновляете только поле. Следующий запрос удаляет объект из массива, имеющий кодовое значение "code2".

CREATE INDEX ix1 ON default (DISTINCT ARRAY v.code FOR v IN etats END) WHERE etatType = "type1";

UPDATE default AS d  
SET d.etats = ARRAY v FOR v IN d.etats WHEN v.code != "code2" END
WHERE d.etatType = "type1" AND ANY v IN d.etats SATISFIES v.code = "code2" END;

Если вам действительно нужен индекс только для вашего запроса.

CREATE INDEX ix1 ON  `bucket` (etatType);

UPDATE `bucket` SET etats= ARRAY_REMOVE( etats, etats[2])
WHERE etatType = "type1";
person vsr    schedule 04.04.2019