Триггеры

На закладке «Триггеры» вы можете создать описания для стандартных триггеров.

Триггеры

Триггеры - скрипты на 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;
}