Firebase更新competitions子集合字段报gc类型错误的解决方法
报错现象
更新competitions集合下指定文档嵌套的scorecard子集合字段时,触发如下错误:
FirebaseError: Expected type 'gc', but it was: a custom yc object
错误原因
updateDoc接口要求第一个入参必须是单个文档的DocumentReference类型对象,原代码传入的是query()生成的集合查询对象(Query类型),参数类型不匹配直接触发报错。- 原代码传入的
{ merge: true }配置是无效参数:updateDoc本身的逻辑就是仅更新传入的指定字段,不会覆盖全量文档,merge是setDoc接口的专属配置项,不需要传给updateDoc。
正确实现代码
你需要先执行查询拿到匹配scorecardid的目标文档引用,再调用更新接口,参考实现:
// 引入需要的方法:import { query, collection, where, getDocs, updateDoc, doc } from "firebase/firestore" // 构建scorecard子集合查询条件 const scorecardQuery = query( collection(db, 'competitions', id, 'scorecard'), where("id", "==", scorecardid) ); // 执行查询拿到结果集 const querySnapshot = await getDocs(scorecardQuery); // 遍历匹配到的文档执行更新(若id唯一则只会命中1条文档) querySnapshot.forEach(async (docSnapshot) => { await updateDoc(docSnapshot.ref, { finalscore: 300 }); });
如果你的scorecard子集合内的文档ID本身就和scorecardid值一致,可以跳过查询步骤直接构建文档引用更新,性能更好:
// 直接拼接目标文档路径生成引用,无需额外查询 const targetDocRef = doc(db, 'competitions', id, 'scorecard', scorecardid); await updateDoc(targetDocRef, { finalscore: 300 });
数据库结构参考


内容的提问来源于stack exchange,提问作者Pieter Venter
相关产品推荐
相关产品推荐

