Firebase集合单文档内合并Google Sheets同步的新增数据实现方法
Firebase 单文档数据合并实现方案
核心问题原因
你当前代码存在两个核心问题导致每次生成新文档、数据无法合并:
- 调用
collection.doc()时未传入固定文档ID,Firebase会默认生成随机ID的新文档,自然每次运行都会新增文档 - 现有的判断逻辑
if(!this.collection.doc)无效:只要调用collection.doc()方法无论目标文档是否存在都会返回文档引用对象,该判断永远不成立;同时就算开启merge配置,直接传入新数组会直接覆盖原有数组的下标键,不会自动追加内容
修改后代码
你只需要替换excelData方法内的存储逻辑即可,核心思路是固定文档ID -> 读取已有数据 -> 新旧数组合并 -> 写入数据库:
excelData(){ var sf = "https://docs.google.com/spreadsheets/d/1qeCEUlVt_hnuyhnoT1wxMMSv7kZW1s4cUIRLynJ0TxQ/gviz/tq?tqx=out:json"; this.http.get(sf,{responseType: 'text'}).subscribe(res=>{ const data = res.toString().match(/google\.visualization\.Query\.setResponse\(([\s\S\w]+)\)/); if(data && data.length==2){ const obj=JSON.parse(data[1]); const table=obj.table; const header = table.cols.map(({label}) => label); const rows = table.rows.map(({c}) => c.map(({v}) => v)); const values = rows.map(e => header.reduce((o, f, j) => Object.assign(o, {[f]: e[j]}), {})); console.log(values); // ====== 以下是修改的存储逻辑 ====== // 1. 定义固定ID的文档引用,保证整个集合只有这一个文档 const fixedDoc = this.collection.doc('merged_excel_data'); // 2. 先读取文档现有数据 fixedDoc.get().subscribe(docSnapshot => { let finalData: any[] = []; // 3. 如果文档已有数据,先取出旧数据 if(docSnapshot.exists){ const oldData = docSnapshot.data() as any[]; // 4. 合并旧数据和新拉取的数据 finalData = [...oldData, ...values]; // 【可选去重】如果需要按Id去重可以替换上面的合并逻辑为: // const allData = [...oldData, ...values]; // const uniqueMap = new Map(allData.map(item => [item.Id, item])); // finalData = Array.from(uniqueMap.values()); }else{ // 文档不存在就直接用新数据 finalData = values; } // 5. 写入合并后的完整数据 fixedDoc.set(finalData); }) // ====== 修改结束 ====== } }); }
注意事项
- 固定文档ID
merged_excel_data你可以自定义修改,只要保持唯一即可 - 如果你的Google Sheets可能返回重复数据,开启上面注释里的去重逻辑即可避免相同Id的条目重复存储
内容的提问来源于stack exchange,提问作者Notation
相关产品推荐
相关产品推荐

