> ## Documentation Index
> Fetch the complete documentation index at: https://docs.riggery.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# State update

> Изменить одни и те же поля у всех подходящих записей.

**State update** меняет одни и те же поля у всех записей, которые подходят под фильтр. Остальные поля не трогает.

Чтобы добавить записи или заменить запись целиком, используйте [State upsert](/ru/graph/tools/state-upsert).

<h2 id="set">
  Фильтр и значения
</h2>

Подключите предыдущий узел — обычно [Code](/ru/graph/tools/code) — который возвращает:

```json theme={null}
{
  "collection": "rates",
  "where": [{ "path": "lane", "eq": "E" }],
  "set": [{ "path": "status", "value": "C" }]
}
```

Так `status` станет `C` у каждой записи в `rates`, у которой `lane` равен `E`.

`where` — те же фильтры, что у [State query](/ru/graph/tools/state-query). Нужно хотя бы одно условие. Пустой фильтр — ошибка, не «все записи».

`set` — новое значение каждого поля. Если задать объект, он заменит то, что уже лежало. Имена полей — точечные ключи (`status`, `price.amount`).

Если в этом JSON уже есть `collection`, **Коллекцию** на этом узле можно оставить пустой.

Агент может передать те же `where` и `set`, когда вызывает этот инструмент.

<h2 id="input">
  Вход
</h2>

Вкладка инспектора **Настройки**. Правила пустого поля на графе: [Предыдущие узлы](/ru/graph/previous-nodes). **Вставить значение** здесь нет.

У инструмента на агенте **Коллекция** может быть **Решает агент** или **Фиксировано**.

| Поле          | Обязательно | Пустое            | Заметки                                               |
| ------------- | ----------- | ----------------- | ----------------------------------------------------- |
| **Коллекция** | Нет         | Предыдущий Result | Нужна, если в предыдущем Result ещё нет `collection`. |

Без предыдущего Result и без `where` / `set` от агента шаг падает.

<h2 id="output">
  Выход
</h2>

На следующем узле **Предыдущие узлы** показывает **`State update`: Result** (`{{State update.text}}`, пока имя уникально).

| Выход  | В меню | Тип   | Следующий узел получит                                                                                         |
| ------ | ------ | ----- | -------------------------------------------------------------------------------------------------------------- |
| Result | Да     | Текст | Строка статуса вроде `Updated 200 record(s) in "rates".` Не сами записи. Ноль совпадений — успех: `Updated 0`. |

<h2 id="limits">
  Ограничения
</h2>

Не больше 8 фильтров в `where` и 8 полей в `set`. Новые значения вместе — не больше 64000 байт.

Не больше 5000 подходящих записей. Если больше — шаг падает и ничего не пишет. Запустите тот же `set` с более узким `where`, затем следующий кусок, пока в каждом запуске не будет не больше 5000.

Пример — 8000 строк в двух направлениях, тот же новый `status`:

```json theme={null}
{
  "collection": "rates",
  "where": [{ "path": "lane", "eq": "E" }],
  "set": [{ "path": "status", "value": "C" }]
}
```

```json theme={null}
{
  "collection": "rates",
  "where": [{ "path": "lane", "eq": "W" }],
  "set": [{ "path": "status", "value": "C" }]
}
```

Если одно значение всё ещё даёт слишком много строк, добавьте другое поле (`eq`, `in` или диапазон `gte` / `lt`).

Если поле нельзя записать, потому что по дороге лежит не объект, шаг падает и ничего не пишет. Пример: писать `price.amount`, когда `price` уже строка `"flat"`.

Если у коллекции есть схема, каждое новое значение должно ей соответствовать. Несовпадение — шаг падает и ничего не пишет.
