Массовые действия с элементами приложения

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

  • Application.batch().save() — массовое добавление элементов приложения;
  • Application.batch().update() — массовое обновление полей элементов приложения;
  • Application.batch().delete() — массовое удаление элементов приложения.

Обратите внимание:

  • за один запрос обрабатывается не более 10000 элементов;
  • в приложении, в котором выполняются массовые действия, текущему пользователю должны быть выданы права на импорт данных.

Эти ограничения применяются ко всем указанным методам.

Массовое добавление элементов

Используя Application.batch().save(), вы можете за один запрос:

  • сохранить новые элементы в базу данных. В этом случае при создании новых элементов в сохраняемых элементах будут установлены идентификаторы, которые после сохранения можно использовать для доступа к созданным элементам;
  • обновить поля существующих элементов. В этом случае укажите их идентификаторы, чтобы по ним найти нужные элементы, внести в них изменения и сохранить отредактированные элементы в базе данных.

При перечислении создаваемых элементов вы можете использовать в методе:

  • массив — чтобы создать определённое количество данных;
    await Application.batch().save().items(orders).all(); // Тут `orders` — это массив элементов приложения, в которые внесены изменения
    
  • генератор — чтобы работать с большим объёмом и динамически создавать элементы по одному до достижения заданного количества, а затем сохранить созданные объекты в базу данных. Это позволяет не перегружать память сервиса worker на сервере.
    await Application.batch().save().items((function*(){ // Задаём массовое сохранение элементов и получаем в метод `items()` элементы, создаваемые функцией-генератором
      for (var i = 0; i < 500; i++) { // Выполняем цикл 500 раз, чтобы создать 500 элементов
          var item = Application.create(); // Каждый раз создаём элемент
          yield item // Возвращаем созданный элемент из генератора 
      }
    })()).all(); // Сохраняем все элементы
    
    Подробнее об использовании Application.batch().save() читайте также в статьях:
  • «Метод массового сохранения»;
  • «Объект сохранения элементов приложения»;
  • «Объект настройки массового сохранения элементов приложения»;
  • «Массовые действия с элементами приложений в скрипте».

Массовое обновление полей элементов

С помощью метода Application.batch().update() обновляется множество полей за один запрос. При этом вы можете:

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

При написании скрипта с Application.batch().update() вы можете определить критерии для обновляемых элементов, используя метод set(), в котором:

  1. Задайте имя обновляемого поля. Вы можете выбрать только существующее поле приложения.
  2. Укажите, что сделать с этим полем:
  • заполнить определённым значением. При этом для поля типа Число можно указать только число, для поля типа Строка – текст и т. д.;

    Application.batch().update().set('numberField', (f, op) => 1); // OK. Константа соответствует типу поля `numberField` – Число
    Application.batch().update().set('numberField', (f, op) => ''); // Ошибка. Строковая константа не соответствует типу поля Число
    
  • заполнить значением другого поля того же типа;

    Application.batch().update().set('numberField1', (f, op) => f.numberField2); // OK. Типы полей приложения `numberField1` и `numberField2` — числа
    Application.batch().update().set('numberField1', (f, op) => f.strField); // Ошибка. Строковое поле `strField` не может быть приравнено к числовому полю `numberField1`
    
  • выполнить действие над значением в поле:

    • увеличить поле типа Число на заданное значение;
      Application.batch().update().set('numberField', (f, op) => op.inc(f.numberField, 1)); // Увеличение значение поля `numberField` на 1
      
    • объединить два или более поля типа Строка;
      Application.batch().update().set('strLocation', (f, op) => op.concat(f.strCountry, ',', f.strCity)); // Поле `strLocation` обновится как '{strCountry}, {strCity}', т. е. в нём будет записано два значения через запятую: страна, город
      
    • удалить элемент в полях с опцией Несколько;
      Application.batch().update().set('users', (f, op) => op.remove(user)); // Удалили пользователя
      
    • добавить элемент в поля с опцией Несколько.
      Application.batch().update().set('users', (f, op) => op.push(user, user1)); // Добавляем в конец массива двух пользователей. При этом тип полей `user`, `user1` должен быть того же типа, что и одиночный элемент поля `users`
      

При использовании метода Application.batch().update() обратите внимание на следующие особенности:

  • в одном запросе поле можно обновить только один раз;
  • если в скрипте не указано количество обновляемых элементов, то по умолчанию обновятся 10 элементов. При этом максимальное значение составляет 10000 элементов;
  • действия, которые вы задаёте в одном запросе в методах set() независимы и не влияют друг на друга. Поэтому порядок их расположения не имеет значения.

Пример:

var rows1 = await Application.batch()
       .update()
       .set('number', _ => 100)
       .set('another_number', f => t.number)
       .all();
var rows2 = await Application.batch()
       .update()
       .set('another_number', f => t.number)
       .set('number', _ => 100)
       .all();
// В обоих случаях `number` = 100, а `another_number` = значение поля `number` до обновления

Подробнее об использовании Application.batch().update() читайте также в статьях:

Массовое удаление элементов

С помощью метода Application.batch().delete() удаляется множество элементов приложения за один запрос. При этом вы можете:

  • определить критерии поиска элементов, которые нужно удалить;
  • ограничить количество удаляемых элементов.

При использовании метода Application.batch().delete() обратите внимание, что если в скрипте не указано количество удаляемых элементов, то по умолчанию удалятся 10 элементов. При этом максимальное значение составляет 10000 элементов.

Пример:

var count = await Application.batch()
.delete()
// Задаём критерии для поиска удаляемых элементов приложения
.where(f => f.number.gte(10))
.size(100)
.all();

Подробнее об использовании Application.batch().delete() читайте также в статьях: