Firebase功能:更新所有文档子集中的特定文档

时间:2018-11-04 21:18:54

标签: firebase google-cloud-functions

我们有airports集合,其中包含由admin管理的机场列表。每个客户的子集合companies/{companyId}/airports中都有此列表的重复项。在该集合的每个文档中,只读数据与“主”文档中的只读数据相同,另外每个客户还有单独的其他数据。

因此,如果我们更新,添加或删除主要机场集合中的某些机场,我们也希望更新每个客户的机场子集合中的相同文档。

我创建了此函数:

import {chunk} from 'lodash';

export const db = admin.firestore();
export const MAX_BATCH_SIZE = 500;

export async function updateCustomersAirports(change: Change<DocumentSnapshot>, context: EventContext) {
    const airportId: string = context.params.airportId;
    const newAirportData: DocumentData = change.after.exists ? change.after.data() : null;

    try {
        const companies = await getCompanies();

        const batches = chunk(companies, MAX_BATCH_SIZE).map((companiesSnapshots: QueryDocumentSnapshot[]) => {
            const batch = db.batch();

            companiesSnapshots.forEach((companySnapshot: QueryDocumentSnapshot) => {
                const airportRef = db.collection('companies').doc(companySnapshot.id).collection('airports').doc(airportId);

                if (newAirportData) {
                    batch.set(airportRef, newAirportData, {merge: true});
                } else {
                    batch.delete(airportRef);
                }
            });

            return batch.commit();
        });

        await Promise.all(batches);

        console.log('Airport ', airportId, ' successfully updated.');
    } catch (error) {
        console.error('Airport ', airportId, newAirportData.name, ' update failed.', error);
    }
}

async function getCompanies(): Promise<QueryDocumentSnapshot[]> {
    const companies = await db.collection('companies').get();
    return companies.docs;
}

效果很好,但是我不确定性能或成本。以这种方式更新文档是一种好习惯吗?

0 个答案:

没有答案