我们有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;
}
效果很好,但是我不确定性能或成本。以这种方式更新文档是一种好习惯吗?