Триггеры
На закладке «Триггеры» вы можете создать описания для стандартных триггеров.
Триггеры - скрипты на JavaScript, выполняемые при определенных операциях над данными. Все триггеры выполняются в замыканиях, имеют локальный контекст. Выберите триггер из предлагаемого списка и введите его описание в отведенном для этого окне. Для сохранения введенного описания нажмите на ссылку «Сохранить». Для активации созданного триггера установите опцию «Активировать». Без установки данной опции триггер не будет работать.
При выполнении триггера в его контексте создаются объекты DataManager
и pool
.
Ограничение времени работы
Максимальное время выполнения каждого триггера - 500 миллисекунд.
Ограничение стека вызовов
Максимальная глубина стека вызовов триггеров - 10. Пример: Если в триггере после операции "insert" выполнять операцию "insert" в эту же коллекцию, то будет вставлено 10 документов, после чего цепочка вызовов будет остановлена.
Прерывание/выполнение операций в результате работы триггера
При выполнении триггеров перед операциями "insert", "update" и "delete", необходимо в результате выполнять return true
для продолжения выполнения операциий документа, и return false
для прерывания выполнения операций. Если триггер не возвращает значения, то по умолчание результат его работы - false
Возврат данных при прерывании выполнения операции триггера
В случае, если при прерывании операции триггера вам необходимо вернуть данные - вы можете указать возвращаемые данные в параметре pool.result
.
К примеру, в триггере перед добавлением документа реализуем проверку обязательности наличия поля.
if (!pool.doc.hasOwnProperty('name')) { // проверим наличие поля "name" в создаваемом документе
pool.result = "Необходимо указать имя";
return false; // прервем создание документа в случае отсутствия поля
};
return true; // В случае, если значение поля присутствует - продолжим операцию
Теперь при попытке добавить документ с отсутствующим полем name, операция добавления документа прервется и будут возвращены следующие данные:
{
"errCode": 412,
"errMsg": "beforeInsert Trigger result: false",
"error": true,
"result": "Необходимо указать имя"
}
Объект pool
Объект pool
содержит следующие данные:
Перед операцией insert
:
{
coll : "", // имя коллекции
doc : {}, // документ с парами имя_поля:значение
user : {
"_id": "", // идентификатор пользователя
"roles": [] // роли пользователя
} // информация о пользователе, для которого открыта сессия
}
После операции insert
:
{
coll : "", // имя коллекции
newDoc : {}, // вновь созданный документ с парами имя_поля:значение
user : {
"_id": "", // идентификатор пользователя
"roles": [] // роли пользователя
} // информация о пользователе, для которого открыта сессия
}
Перед операцией remove
:
{
coll : "", // имя коллекции
query : {}, // поисковый запрос, в соответствии с которым необходимо удалить документы
user : {
"_id": "", // идентификатор пользователя
"roles": [] // роли пользователя
} // информация о пользователе, для которого открыта сессия
}
После операции remove
:
{
coll : "", // имя коллекции
count : int, // количество удаленных документов
docs : [], // массив ID удаленных документов
user : {
"_id": "", // идентификатор пользователя
"roles": [] // роли пользователя
} // информация о пользователе, для которого открыта сессия
}
Перед операцией update
:
{
coll : "", // имя коллекции
doc : {}, // документ с правилами обновления значений
query : {}, // поисковый запрос, в соответствии с которым необходимо обновить документы
user : {
"_id": "", // идентификатор пользователя
"roles": [] // роли пользователя
} // информация о пользователе, для которого открыта сессия
}
После операции update
:
{
coll : "", // имя коллекции
count : int, // количество обновленный документов
docs : [], // массив ID обновленных документов
user : {
"_id": "", // идентификатор пользователя
"roles": [] // роли пользователя
} // информация о пользователе, для которого открыта сессия
}
Перед операцией updatebyid
:
{
coll : "", // имя коллекции
doc : {}, // документ с правилами обновления значений
query : {}, // поисковый запрос {"_id" : }
user : {
"_id": "", // идентификатор пользователя
"roles": [] // роли пользователя
} // информация о пользователе, для которого открыта сессия
}
После операции updatebyid
:
{
coll : "", // имя коллекции
newDoc : {}, // обновленный документ
user : {
"_id": "", // идентификатор пользователя
"roles": [] // роли пользователя
} // информация о пользователе, для которого открыта сессия
}
Перед операцией find
:
{
coll : "", // имя коллекции
query : {}, // поисковый запрос {"_id" : }
fields : [], // список полей документа, который необходимо вернуть в результате запроса
user : {
"_id": "", // идентификатор пользователя
"roles": [] // роли пользователя
}, // информация о пользователе, для которого открыта сессия
"extPool": {} // дополнительный набор данных, который можно использовать в триггере
}
Объект DataManager
Объект DataManager
содержит следующие методы работы с данными:
DataManager.Insert(data Object)
Метод для вставки документа в коллекцию. Параметры:
data Object
- объект, содержащий следующие атрибуты:
{
coll : "", // имя коллекции, обязательный
doc : {} // документ с парами имя_поля:значение, необязательный
}
Возвращаемое значение - Object
:
Выполнено
{
error : false,
result : {} // созданный документ
}
Ошибка
{
error : true,
errCode : 4XX/5XX, // Код ошибки
errMsg : "Текст ошибки"
}
DataManager.Remove(data Object)
Метод для удаления документов из коллекции. Параметры:
Data Object
- объект, содержащий следующие атрибуты:
{
coll : "", // имя коллекции, обязательный
query : {}, // запрос с парами имя_поля/оператор:значение, необязательный
limit : int // лимит количества удаляемых документов, необязательный,
// если не указан, то удалятся первые 1000 документов
}
Возвращаемое значение - Object
:
Выполнено
{
error : false,
result : {
count : int, // количество удаленных документов
docs : [] // массив ID удаленных документов
}
}
Ошибка
{
error : true,
errCode : 4XX/5XX, // Код ошибки
errMsg : "Текст ошибки"
}
DataManager.Update(data Object)
Метод для обновления документов в коллекции. Параметры:
Data Object
- объект, содержащий следующие атрибуты:
{
coll : "", // имя коллекции, обязательный
query : {}, // запрос с парами имя_поля/оператор:значение, необязательный
doc : {}, // документ с парами оператор:значение, обязательный
limit : int // лимит количества обновляемых документов, необязательный,
// если не указан, то обновятся первые 1000 документов
}
Возвращаемое значение - Object
:
Выполнено
{
error : false
result : {
count : int, // количество удаленных документов
docs : [] // массив ID измененных документов
}
}
Ошибка
{
error : true,
errCode : 4XX/5XX, // Код ошибки
errMsg : "Текст ошибки"
}
DataManager.UpdateById(data Object)
Метод для обновления одного документа в коллекции, идентифицируемого по ID. Параметры:
data Object
- объект, содержащий следующие атрибуты:
{
coll : "", // имя коллекции, обязательный
query : {}, // запрос в формате "_id" : "<идентификатор документа>", обязательный
doc : {} // документ с парами оператор:значение, обязательный
}
Возвращаемое значение - Object
:
Выполнено
{
error : false,
result : {} // обновленный документ
}
Ошибка
{
error : true,
errCode : 4XX/5XX, // Код ошибки
errMsg : "Текст ошибки"
}
DataManager.Find(data Object)
Метод для запроса документов из коллекции. Параметры:
data Object
- объект, содержащий следующие атрибуты:
{
coll : "", // имя коллекции, обязательный
query : {}, // запрос с парами имя_поля/оператор:значение, необязательный, если пустой,
// то будут возвращены первые 100 документов
sort : {}, // сортировка по полям в формате имя_поля:1/-1, необязательный
fields : [], // список имен полей, которые будут возвращены в каждом документе, необязательный
limit : int, // лимит размера выборки, необязательный, по умолчанию 50
skip : int // количество документов, которое нужно пропустить в выборке
}
Возвращаемое значение - Object
:
Выполнено
{
error : false,
result : [] // массив выбранных документов с учетом лимита
}
Ошибка
{
error : true,
errCode : 4XX/5XX, // Код ошибки
errMsg : "Текст ошибки"
}
DataManager.Count(data Object)
Метод для запроса количества документов по условию в коллекции. Параметры:
data Object
- объект, содержащий следующие атрибуты:
{
coll : "", // имя коллекции, обязательный
query : {} // запрос с парами имя_поля/оператор:значение, необязательный
}
Возвращаемое значение - Object
:
Выполнено
{
error : false,
result : int // количество документов
}
Ошибка
{
error : true,
errCode : 4XX/5XX, // Код ошибки
errMsg : "Текст ошибки"
}
DataManager.RunScript(data Object)
Метод для запуска серверного скрипта. Параметры:
data Object
- объект, содержащий следующие атрибуты:
{
script : "", // ID скрипта, обязательный
acc : "", // scriptKey, необязательный, только если вызов скрипта совершается анонимно
pool : {} // пул данных для установки передачи в контекст скрипта, необязательный
}
Возвращаемое значение - Object
:
ыполнено
{
error : false
}
Ошибка
{
error : true,
errCode : 4XX/5XX, // Код ошибки
errMsg : "Текст ошибки"
}
Примеры триггеров
Установка обязательности наличия значения поля.
Перед добавлением документа проверим наличие значения поля "name" и, в случае его отсутствия, прервем операцию добавления документа.
if (!pool.doc.hasOwnProperty('name')) { // проверим наличие поля "name" в создаваемом документе
return false; // прервем создание документа в случае отсутствия поля
} else {
return true; // В случае, если значение поля присутствует - продолжим операцию
};
Установка значения по-умолчанию.
Перед добавлением документа проверим наличие значения поля "name" и, в случае его отсутствия, установим значение по-умолчанию.
if (!pool.doc.hasOwnProperty('name')) { // проверим наличие поля "name" в создаваемом документе
pool.doc.name = "Джон Сноу"; // в случае отсутствия значения, установим значение по-умолчанию
}
return true; // В случае, если значение поля присутствует - продолжим операцию.
Добавление связанного документа другой коллекции.
После добавления документа, создадим документ в другой коллекции со ссылкой на добавленный.
DataManager.Insert({ // выполним операцию добавления документа в коллекцию "stuff"
coll : "stuff",
doc : {
"thing": pool.newDoc._id // передадим _id созданного документа в поле типа "pointer"
}
})
Удаление связанных документов другой коллекции.
Перед удалением документа, удалим все документы другой коллекции со ссылкой на удаляемый.
DataManager.Remove({ // выполним удаление связанных документов в коллекции "stuff"
coll : "stuff",
query: {
"thing": pool.query._id // передадим _id удаляемого документа
}
})
return true;
Вызов серверного скрипта.
После добавления документа, запустим скрипт, передав ему новый документ. Скрипт может, например, осуществлять рассылку PUSH-уведомлений.
DataManager.RunScript({ // выполним запуск скрипта с ID 580b386d42d52f1ba275fc24
script : "580b386d42d52f1ba275fc24",
pool: {
"doc": pool.newDoc // передадим в скрипт новый документ
}
})
Обновление документа по его id
DataManager.UpdateById({
coll: "items",
query: {
"_id":"ICr2iqfLoa"
},
doc: {
"$set":{
"anotherExampleField": "trigger"
}}
});
Поиск документов другой коллекции
var memberFinded = DataManager.Find({
coll: "members",
query:{
"memberName": {"$eq": pool.doc.strangerName}
},
sort:{
"updatedAt": 1
},
fields : ["_id", "peerReviews" "status", "importantInfo", "otherStuff"],
limit : 1,
});
if (!memberFinded.error && memberFinded.length > 0) {
DataManager.RunScript({
script : "580b386d42d52f1ba275fc24",
pool: {
"strangerInfo": pool.doc,
"results": memberFinded.result
}
});
return true;
} else {
pool.result = "Произошла какая-то ошибка";
return false;
}