【问题标题】:Integrating batch commit and cloud firestore triggers集成批量提交和 Cloud Firestore 触发器
【发布时间】:2019-03-29 07:01:08
【问题描述】:

我正在批量提交 50 个文档到名为“Activities”的云 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');
});

对于以批量提交方式编写的每个文档,我希望触发此云功能。

谢谢。

【问题讨论】:

    标签: google-cloud-firestore


    【解决方案1】:

    如果您完全删除集合然后进行批量提交,它会正常工作,因为如果集合已经存在并且您尝试覆盖文档,云触发器将不会启动。您必须先删除所有文档。

    【讨论】:

      猜你喜欢
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 2018-08-03
      • 2020-10-15
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      相关资源
      最近更新 更多