Когда нужно обработать большое количество элементов приложения за один запрос, вы можете написать скрипт, используя методы массового добавления элементов или обновления их полей:
Application.batch().save() — массовое добавление элементов приложения;
Application.batch().update() — массовое обновление полей элементов приложения;
Application.batch().delete() — массовое удаление элементов приложения с возможностью их восстановления;
Application.batch().hardDelete() — массовое безвозвратное удаление элементов приложения. Требуется включение фича-флага;
Application.batch().setStatus() — массовая смена статуса элементов приложения.
Обратите внимание:
за один запрос обрабатывается не более 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(), в котором:
Задайте имя обновляемого поля. Вы можете выбрать только существующее поле приложения.
Укажите, что сделать с этим полем:
заполнить определённым значением. При этом для поля типа Число можно указать только число, для поля типа Строка – текст и т. д.;
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.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().hardDelete(). Требуется включение фича-флага.
В обоих методах вы можете:
определить критерии поиска элементов, которые нужно удалить;
ограничить количество удаляемых элементов.
Обратите внимание, что если в скрипте не указано количество удаляемых элементов, то по умолчанию удалятся 10 элементов. При этом максимальное значение составляет 10000 элементов.
Пример:
var count = await Application.batch()
.delete()
// Задаём критерии для поиска удаляемых элементов приложения
.where(f => f.number.gte(10))
.size(100)
.all();
Подробнее о других примерах использования методов и их особенностях читайте в статьях:
С помощью метода Application.batch().setStatus() выполняется массовая смена статуса элементов приложения в рамках одной операции. В методе можно задать:
критерии поиска элементов приложения, статус которых нужно изменить;
Массовые действия с элементами приложения
Когда нужно обработать большое количество элементов приложения за один запрос, вы можете написать скрипт, используя методы массового добавления элементов или обновления их полей:
Application.batch().save()— массовое добавление элементов приложения;Application.batch().update()— массовое обновление полей элементов приложения;Application.batch().delete()— массовое удаление элементов приложения с возможностью их восстановления;Application.batch().hardDelete()— массовое безвозвратное удаление элементов приложения. Требуется включение фича-флага;Application.batch().setStatus()— массовая смена статуса элементов приложения.Обратите внимание:
Эти ограничения применяются ко всем указанным методам.
Массовое добавление элементов
Используя
Application.batch().save(), вы можете за один запрос:При перечислении создаваемых элементов вы можете использовать в методе:
await Application.batch().save().items(orders).all(); // Тут `orders` — это массив элементов приложения, в которые внесены измененияПодробнее об использовании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(), в котором:заполнить определённым значением. При этом для поля типа Число можно указать только число, для поля типа Строка – текст и т. д.;
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` на 1Application.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()обратите внимание на следующие особенности: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().hardDelete(). Требуется включение фича-флага.В обоих методах вы можете:
Обратите внимание, что если в скрипте не указано количество удаляемых элементов, то по умолчанию удалятся 10 элементов. При этом максимальное значение составляет 10000 элементов.
Пример:
var count = await Application.batch() .delete() // Задаём критерии для поиска удаляемых элементов приложения .where(f => f.number.gte(10)) .size(100) .all();Подробнее о других примерах использования методов и их особенностях читайте в статьях:
Массовая смена статусов элементов
С помощью метода
Application.batch().setStatus()выполняется массовая смена статуса элементов приложения в рамках одной операции. В методе можно задать: