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

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

  • 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() читайте также в статьях: