【发布时间】: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');
});
对于以批量提交方式编写的每个文档,我希望触发此云功能。
谢谢。
【问题讨论】: