Интеграция триггеров пакетной фиксации и облачного пожарного хранилища - PullRequest
0 голосов
/ 29 марта 2019

Я выполняю пакетную фиксацию документов кусками по 50 в облачной коллекции Firestore под названием «Деятельности», и я написал облачную функцию, которая запускается при создании, обновлении и удалении любого документа в этой коллекции, но облачная функция получает срабатывает только один раз для каждой партии, а не для всех документов в пакете.

Я посчитал журналы, в которых указано, сколько раз были вызваны облачные функции, и это приблизительно соответствует количеству вызовов пакетной фиксации.

Код, выполняющий пакетную фиксацию:

    const activitiesRef = app.firestore.collection(`activities`);
    if (_.isArray(insertObj)) {
        const chunksOf450 = await _.chunk(insertObj, 450);

        for (const singleChunk of chunksOf450) {
            // Get a new write batch
            const batch = app.firestore.batch();
            for (const obj of singleChunk) {
                const tempRef = activitiesRef.doc((obj as any).uid);
                batch.set(tempRef, obj);
            }

            // Commit the batch
            await batch.commit();
        }

        return {
            message: 'All objects written to database successfully'
        };

Облачная функция, которая запускается при onWrite:

export default functions.firestore.document('activities/{activityId}').onWrite(async (snap, context) => {
const isDocumentExists = snap.after.exists

utils.app.initializeApp(initializeAdminApp.default);
adminUtils.ElasticHelper.init();


if (isDocumentExists) {

    const afterDocData = snap.after.data();
    const afterDocId = snap.after.id;

    console.log('starting..', afterDocData, afterDocId);



    const { contentType } = snap.after.data();

    if (contentType === 'activityTypes') {
        await adminUtils.ElasticHelper.index('activity', afterDocId, afterDocData);
    }
    if (contentType === 'itemTypes') {
        await adminUtils.ElasticHelper.index('item', afterDocId, afterDocData);
    }
    if (contentType === 'questionTypes') {
        await adminUtils.ElasticHelper.index('question', afterDocId, afterDocData);
    }

} else {
    const beforeDocId = snap.before.id;
    const { contentType } = snap.before.data();

    console.log('deleting on elastic ..', beforeDocId);

    if (contentType === 'activityTypes') {
        await adminUtils.ElasticHelper.delete('activity', beforeDocId);
    }
    if (contentType === 'itemTypes') {
        await adminUtils.ElasticHelper.delete('item', beforeDocId);
    }
    if (contentType === 'questionTypes') {
        await adminUtils.ElasticHelper.delete('question', beforeDocId);
    }
}
console.log('function success');
});

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

Спасибо.

1 Ответ

0 голосов
/ 02 апреля 2019

Работает нормально, если вы полностью удалите коллекцию, а затем выполните пакетную фиксацию, потому что, если коллекция уже существует и вы пытаетесь перезаписать документы, облачные триггеры не запустятся.Сначала вы должны удалить все документы.

...