向Firestore写入与文档现有相同数据,使用setDoc是否算作写入操作?
Firestore写入相同数据的计费说明
当你使用await setDoc(refDoc, { the_same_data, as_in_refDoc })向Firestore文档写入与现有内容完全一致的数据时,该操作会被算作一次写入操作,Firestore没有针对这种场景的自动优化机制。
原因说明
Firestore的写入计费是基于操作请求的发起,而非最终数据是否发生变更。即使传入的数据和文档当前内容完全相同,setDoc依然会触发完整的写入流程:包括权限验证、数据同步到多地区副本(如果开启了多地区部署)等环节,这些都会被计入写入次数并产生对应费用。
避免不必要计费的方案
如果想跳过无意义的相同数据写入,需要自行在代码中做前置判断:先读取文档当前数据,对比后再决定是否执行写入。示例代码如下:
const docSnap = await getDoc(refDoc); if (docSnap.exists()) { const currentData = docSnap.data(); // 注意:需使用深对比判断数据是否完全一致,浅对比可能遗漏嵌套字段的差异 if (!_.isEqual(currentData, { the_same_data, as_in_refDoc })) { await setDoc(refDoc, { the_same_data, as_in_refDoc }); } } else { await setDoc(refDoc, { the_same_data, as_in_refDoc }); }
不过这种方案会额外产生一次读取操作的费用,需要根据你的业务场景权衡:如果重复写入相同数据的频率很高,这种优化能节省成本;如果频率较低,额外的读取成本可能反而不划算。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

