Firebase Swift中exerciseSet数据获取失败,关联exercise无法读取
解决Firebase中读取关联DocumentReference的问题
问题核心是:exerciseSet中的exercise字段是DocumentReference类型,Firebase不会自动拉取关联的文档数据,直接返回的exercise只是一个引用对象,导致你解析模型时无法正确映射,最终exerciseSetList为空(大概率是模型解析失败过滤掉了数据)。
解决方案步骤
1. 明确数据模型定义
确保你的模型正确识别DocumentReference类型:
// fbExercise 模型 interface fbExercise { id: string; name: string; // 其他exercise的字段,比如targetMuscle、description等 } // fbExerciseSet 模型(原始带引用的版本) interface fbExerciseSet { id: string; reps: number; weight: number; exercise: firebase.firestore.DocumentReference; // 其他exerciseSet字段,比如createdAt等 } // 最终要返回的完整类型(合并exercise数据) interface FullExerciseSet extends Omit<fbExerciseSet, 'exercise'> { exercise: fbExercise; }
2. 修改getExerciseSets函数,手动拉取关联文档
有两种实现方式,根据数据量选择:
方式一:遍历每个exerciseSet,单独获取关联exercise(适合数据量小的场景)
async function getExerciseSets() { // 先获取所有exerciseSet集合数据 const exerciseSetSnapshot = await db.collection('exerciseSet').get(); // 遍历每个exerciseSet,并行请求关联的exercise文档 const fullExerciseSets = await Promise.all( exerciseSetSnapshot.docs.map(async (doc) => { const setData = doc.data(); // 通过DocumentReference的get()方法获取关联文档 const exerciseDoc = await setData.exercise.get(); return { id: doc.id, reps: setData.reps, weight: setData.weight, // 合并exercise数据,加上文档id exercise: { id: exerciseDoc.id, ...exerciseDoc.data() } // 其他字段按需添加 }; }) ); return fullExerciseSets; }
方式二:批量获取所有关联exercise(适合数据量大的场景,性能更优)
通过Firebase的getAll()方法批量读取所有exercise引用,减少请求次数:
async function getExerciseSets() { const exerciseSetSnapshot = await db.collection('exerciseSet').get(); const rawExerciseSets = exerciseSetSnapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); // 收集所有exercise的DocumentReference const exerciseRefs = rawExerciseSets.map(set => set.exercise); // 批量获取所有exercise文档 const exerciseDocs = await db.getAll(...exerciseRefs); // 将exercise数据映射到对应的exerciseSet return rawExerciseSets.map((set, index) => { const exerciseDoc = exerciseDocs[index]; return { ...set, exercise: { id: exerciseDoc.id, ...exerciseDoc.data() } }; }); }
注意事项
- 如果你的
exerciseSetList为空是因为模型解析报错(比如把DocumentReference当成普通对象解析失败),确保修改后的返回数据结构和你的前端模型完全匹配。 - 若数据量极大,批量请求也可能触发Firebase的请求限制,此时可以考虑分页获取exerciseSet,再分批拉取关联的exercise。
内容的提问来源于stack exchange,提问作者Rachel
相关产品推荐
相关产品推荐

